#include<iostream>
using namespace std;
int v,n,a[35];
int mmax(int a,int b){
return a>b?a:b;
}
int d(int i,int j){
if(i>n) return 0;
if(j>=a[i]) return mmax(d(i+1,j),d(i+1,j-a[i])+a[i]);//注意
else return d(i+1,j);
}
int main(){
cin>>v;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
//cout<<v<<n;
printf("%d",v-d(1,v));
return 0;
}
题解:价值等于体积的01背包问题,递归写法简单明了但应注意边界的处理!
下面给出递推+滚动数组的算法,仅使用了一维数组。
#include<cstdio>
#include<iostream>
using namespace std;
int v,n,a,f[100000],c;
int main(){
scanf("%d %d",&c,&n);
for(int i=1;i<=n;i++){
scanf("%d",&v);
for(int j=c;j>=0;j--){
if(j>=v) f[j]=f[j]>(f[j-v]+v)?f[j]:(f[j-v]+v);
}
}
cout<<c-f[c];
return 0;
}