問題描述
有乙個箱子容量為v(正整數,0<=v<=20000),同時有n個物品(0<n<=30),每個物品有乙個體積(正整數)。
要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。
輸入格式
第一行為乙個整數,表示箱子容量;
第二行為乙個整數,表示有n個物品;
接下來n行,每行乙個整數表示這n個物品的各自體積。
輸出格式
乙個整數,表示箱子剩餘空間。
樣例輸入 24
6 83 12
7 97
樣例輸出0
思路分析:這裡我使用暴力搜尋,每種物品都有兩種選擇,要麼放入箱子,要麼不放入;
窮舉所有可能性並把剩餘空間最小的值儲存下來即可
#include#includeusing namespace std;
int v,n,a[31];
int num=1000000;
void dfs(int vv,int ii) //vv為剩餘體積 ii為物品序號
int main()
{ freopen("2.txt", "r",stdin);
cin>>v>>n;
for(int i=0;i>a[i];
dfs(v,0);
cout<
之前沒有學習揹包問題,發現這個問題也可以用動態規劃來解決,更加簡潔快速。
定義乙個陣列 dp[i] 表示總體積為i的箱子能放入物品的最大體積。
同樣的,為了求出最大價值化,從下而上遞推求出j體積(j<=i)的最大體積
狀態方程為: dp[i] = max( dp[i] , dp[i - a[j]] + a[j] )
**如下:
#include#includeusing namespace std;
int v,n,a[31];
int dp[20200];
int main()
{// freopen("2.txt", "r",stdin);
cin>>v>>n;
for(int i=0;i>a[i];
for(int i=0;i=a[i];j--)
dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
cout<
演算法訓練 裝箱問題
問題描述 有乙個箱子容量為v 正整數,0 v 20000 同時有n個物品 0 n 30 每個物品有乙個體積 正整數 要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。輸入格式 第一行為乙個整數,表示箱子容量 第二行為乙個整數,表示有n個物品 接下來n行,每行乙個整數表示這n個物品的各自體積...
演算法訓練 裝箱問題
問題描述 有乙個箱子容量為v 正整數,0 v 20000 同時有n個物品 0 n 30 每個物品有乙個體積 正整數 要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。輸入格式 第一行為乙個整數,表示箱子容量 第二行為乙個整數,表示有n個物品 接下來n行,每行乙個整數表示這n個物品的各自體積...
藍橋網 演算法訓練 裝箱問題
問題描述 有乙個箱子容量為v 正整數,0 v 20000 同時有n個物品 0 n 30 每個物品有乙個體積 正整數 要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。輸入格式 第一行為乙個整數,表示箱子容量 第二行為乙個整數,表示有n個物品 接下來n行,每行乙個整數表示這n個物品的各自體積...