演算法訓練 裝箱問題

2021-07-27 10:38:56 字數 1352 閱讀 7813

問題描述

有乙個箱子容量為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個物品的各自體積...