題目描述
有一個箱子容量爲(正整數,),同時有個物品(),每個物品有一個體積(正整數)。
要求個物品中,任取若干個裝入箱內,使箱子的剩餘空間爲最小。
輸入格式
個整數,表示箱子容量
個整數,表示有個物品
接下來行,分別表示這個物品的各自體積
輸出格式
個整數,表示箱子剩餘空間。
輸入輸出樣例
輸入 #1 複製
24
6
8
3
12
7
9
7
輸出 #1 複製
0
說明/提示
普及組 第題
思路
想當年普及第四題竟然是這個難度,哎哎哎哎哎……沒辦法
好吧進入正題。
這個一看就是揹包問題,那麼爲了讓剩餘的體積最小,那麼就要讓裝的最多,那麼,一般的揹包是價值最大,我們不妨讓一個物品的價值就等於體積,這樣就可以使價值最大也就是體積最大了。
如果還沒有會滾動數組的話。
代碼
#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define maxn 31
using namespace std;
int n,m;
int f[20001],v[maxn];//採用滾動
int main(){
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++){
scanf("%d",&v[i]);
for(int j=m;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+v[i]);
}
}
printf("%d",m-f[m]);//求剩餘體積
return 0;
}