最少數量貨物裝箱問題

題目描述
有重量分別爲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)
{
	if (x < 0)       //如果箱子體積小於0則說明這種方法裝不下,返回,嘗試裝體積小的
		return;
	if (x == 0)  // 箱子體積爲0則說明箱子裝滿了,直接輸出貨物個數
	{
		cout << count << endl;
		exit(0);
	}
	dfs(count + 1, x - 7);//嘗試先裝體積爲7的貨物
	dfs(count + 1, x - 5);
	dfs(count + 1, x - 3);
}
int main1()
{
	int x=0;
	while (cin >> x)
	{
		dfs(0, x);
		cout << -1 << endl;
	}
}

思考二
由思考一可知當給定箱子體積並選擇了一個貨物後,要考慮剩下的體積,也就是子問題的最優解。比如給定箱子體積19,裝入體積爲7的貨物後,問題變成了箱子體積12的最優解,針對這種問題要想到動態規劃。dp[i]爲箱子容積爲i時裝滿箱子所需要的最少貨物數目

#include "iostream"
#include "vector"
#include "algorithm"
using namespace std;

int main()
{
	int x;
	while (cin >> x)
	{
		vector<int> dp(x+1, INT_MAX);//dp[i]表示箱子容量爲i時需要的貨物個數,初始化爲INT_MAX表示裝不下
		dp[0] = 0;
		dp[3] = 1;
		dp[5] = 1;
		dp[6] = 2;
		dp[7] = 1;
		int a = dp[x - 7];
		int b = dp[x - 5];
		int c = dp[x - 3];
		for (int i = 8; i <= x; i++)
		{
			if (a == INT_MAX && b == INT_MAX && c == INT_MAX)//裝不下
				dp[i] = INT_MAX;
			else//至少由一種方案可行
				dp[i] = min(min(dp[i-7], dp[i-5]), dp[i-3]) + 1;
		}
		if (dp[x] == INT_MAX)
			cout << -1 << endl;
		else
			cout << dp[x] << endl;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章