0-1背包问题

来源:互联网 发布:天猫淘宝虎彪旗舰店 编辑:程序博客网 时间:2024/05/20 20:28

   有n种物品,每种只有一个。第i个物品的体积为vi,重量为wi.选一些物品放在容量为c的容器内。使得背包内的物品的总体积不超过c的情况下重量尽量大。


分析:

         d(i,j)表示把物品i, i+1,..n放在容器为 j  的背包中的最大总体积。

         d(i,j)=max(d(i+1,j),d(i+1,j-v[i])+w[i])   //状态转换方程

下面是代码,答案是d[1][c]

   for(int i=n;i>=1;i--)

       for(int j=0;j<=c;j++){

            d[i][j]=(i==n?0:d[i+1][j])  ;                                              //先不放,当i=n时,由于先不放,所以先赋值为0.

             if(j>=v[i]) d[i][j]=max(d[i][j],d[i+1][j-v[i]]+w[i])                 //若能放在比较两者之间的大小,选取较大者。 

      } 


同理:

    f(i,j)=max(f(i-1,j),f(i-1,j-v[i])+w[i]);

     此时,f(i,j)表示将1~i的物品放到容积为j的背包中的最大重量。

0 0
原创粉丝点击