: 装箱问题

题目描述

有一个箱子容量为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));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/83859471