题目
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30=,每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小,输出最小剩余空间。
思路
一个物品一个物品搜,搜“放进背包”与“不放”。用一个变量ans=v,v随着放与不放的操作变化,如果v小于ans那么ans=v。
代码
#include<cstdio>
using namespace std;
int v,n,s,a[1001];
void cc(int k){
if(k>n||s==0) return; //搜完了或搜到最佳结果
if(v-a[k]>=0){ //如果放的下,放
v-=a[k]; //背包剩余空间减
if(s>v) s=v; //比较要输出的答案与目前答案
cc(k+1);
v+=a[k]; //退回
}
cc(k+1); //不放,下一个 ^-^
}
int main(){
scanf("%d%d",&v,&n); //我jue得这里没啥好说滴
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
s=v;
cc(1);
printf("%d",s);
}