#include <cstdio>
using namespace std;
int v,n,vv[20005],nn[35];
int max(int a,int b){return a>b?a:b;}
int main(){
scanf("%d%d",&v,&n);
for(int i=1;i<=n;i++)scanf("%d",&nn[i]);
/*
读入数据,v表示背包的容量,n表示有多少个物品
依次读入到nn数组里面
*/
for(int i=1;i<=n;i++){
for(int j=v;j>=nn[i];j--){
vv[j]=max(vv[j],vv[j-nn[i]]+nn[i]);
}
}
/*
第一层for表示,要将1-n个物品放到背包里面
第二个for是从v到nn[i],因为若第二个for小于nn[i]则放不进背包里面,没有意义了
表示v-nn[i] 这些容量 对应着能最大放下多少物品
vv[j]=max(vv[j],vv[j-nn[i]]+nn[i]);
表示容量为j的背包,可以选择放入一个物品,或者直接不放vv[j]=vv[j]
若要放入则是
->当前容量j减去对应的物品的容量
->剩下的容量最多能放多少东西
->即vv数组存放的数值
加上当前j容量能放下的物品的容量
然后与自身vv[j],去最大值保存在j位置---->即当前容量j最大可以放多少容量的物品
*/
printf("%d",v-vv[v]);
return 0;
}
P1049 装箱问题
2019-05-10