題目描述
有一個箱子容量爲VV(正整數,0 \le V \le 200000≤V≤20000),同時有nn個物品(0<n \le 300<n≤30,每個物品有一個體積(正整數)。
要求nn個物品中,任取若干個裝入箱內,使箱子的剩餘空間爲最小。
輸入輸出格式
輸入格式:
11個整數,表示箱子容量
11個整數,表示有nn個物品
接下來nn行,分別表示這nn個物品的各自體積
輸出格式:
11個整數,表示箱子剩餘空間。
輸入輸出樣例
輸入樣例#1: 複製
24 6 8 3 12 7 9 7
輸出樣例#1: 複製
0
#include<cstdio>
using namespace std;
int m,n; m即箱子容量V
int f[20010];
int w[40];
int main(){
int i,j;
scanf("%d%d",&m,&n);
for(i=1;i<=n;i++){
scanf("%d",&w[i]);
}
for(i=1;i<=n;i++){
for(j=m;j>=w[i];j--){ 注意:這裏必須是從m到w[i],否則一個物體會被多次裝入箱子,見例1
if(f[j]<f[j-w[i]]+w[i]){
f[j]=f[j-w[i]]+w[i];
}
}
}
printf("%d\n",m-f[m]);
}
這就是下標問題了,靈活應用。
要知道最大也是m以內,要學會轉化爲已知的。
事實證明,普及組的比較垃圾,還是以後整成一篇文章吧。