題目描述
有重量分別為3,5,7公斤的三種貨物,和乙個載重量為x公斤的箱子(不考慮體積等其它因素,只計算重量)
需要向箱子內裝滿x公斤的貨物,要求使用的貨物個數盡可能少(三種貨物數量無限)
輸入描述:
輸入箱子載重量x(1 <= x <= 10000),乙個整數。
輸出描述:
如果無法裝滿,輸出 -1。
如果可以裝滿,輸出使用貨物的總個數。
示例1輸入4輸出
-1說明
無法裝滿
思考一
本題肯定要用貪心的思想,給出箱子的體積肯定要先裝最大的,如果最大的裝不下則裝體積較小的,依次類推。。。本題中裝箱順序為7,5,3
給定乙個箱子的體積x(假設x>7),按照貪心演算法,肯定先裝體積為7的貨物。接下來考慮剩餘體積y=x-7是否能裝下剩餘的體積,如果剩餘的y>7則繼續迴圈執行上述步驟且貨物數量加一,如果y<7那麼就要去試探裝體積為5或3的貨物。
由於是在試探的迴圈執行,首先想到的是遞迴演算法。每種情況的遞迴返回條件要麼是箱子裝不下要麼是找到合適的裝法
#include "iostream"
using namespace std;
void dfs(int count, int x)
dfs(count + 1, x - 7);//嘗試先裝體積為7的貨物
dfs(count + 1, x - 5);
dfs(count + 1, x - 3);
}int main1()
}
思考二
由思考一可知當給定箱子體積並選擇了乙個貨物後,要考慮剩下的體積,也就是子問題的最優解。比如給定箱子體積19,裝入體積為7的貨物後,問題變成了箱子體積12的最優解,針對這種問題要想到動態規劃。dp[i]為箱子容積為i時裝滿箱子所需要的最少貨物數目
#include "iostream"
#include "vector"
#include "algorithm"
using namespace std;
int main()
if (dp[x] == int_max)
cout << -1 << endl;
else
cout << dp[x] << endl;
}}
快手校招面試題 最少數量貨物裝箱問題
時間限制 c c 1秒,其他語言2秒空間限制 c c 32m,其他語言64m 有重量分別為3,5,7公斤的三種貨物,和乙個載重量為x公斤的箱子 不考慮體積等其它因素,只計算重量 需要向箱子內裝滿x公斤的貨物,要求使用的貨物個數盡可能少 三種貨物數量無限 輸入描述 輸入箱子載重量x 1 x 10000...
快手簡單揹包筆試題 最少數量貨物裝箱問題
有重量分別為3,5,7公斤的三種貨物,和乙個載重量為x公斤的箱子 不考慮體積等其它因素,只計算重量 需要向箱子內裝滿x公斤的貨物,要求使用的貨物個數盡可能少 三種貨物數量無限 輸入箱子載重量x 1 x 10000 乙個整數。如果無法裝滿,輸出 1。如果可以裝滿,輸出使用貨物的總個數。示例1 4 1無...
用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...