题目描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入
第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
输出
一个整数,表示箱子剩余空间。
分析:对于每个物品只存在放与不放,两种情况。因此,我们可以利用递归,将每种情况都讨论到。并从中选出剩余空间最小的情况。
int a[31];//保存物品体积
int n;
int dfs(int i,int j)//代码核心 i表数组下标,j表箱子剩余空间
{ int t,max,t1;
if(i==n)//如果i==n了,则证明已经递归到最后一个。返回j的值就好了
{
return j;
}
if(j<a[i])//如果物品体积大于箱子剩余空间,则当前物品,不能放于箱子
return dfs(i+1,j);//直接看下一个物品的体积。j的值不变
else
{
t=dfs(i+1,j);//当前物品能放进箱子,则分情况讨论是放 还是不放
t1=dfs(i+1,j-a[i]);
if(t<=t1)//返回放与不放的箱子剩余空间的小值
return t;
else
return t1;
}
}
int main()
{
int v;
while(~scanf("%d%d",&v,&n))
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
printf("%d\n",dfs(0,v));
}
}