三种基本背包【0/1、完全、多重】模型构建分析

一、先会找出背包三要素:

       容量V[i]        价值C[i]       费用W[i]

0/1背包 : 1~n,n件(个)物品,每个物品1件。 

             dp[i][v]表示,前i件(个)物品(部分或全部)放入一个容量为V的背包可以获得的最大价值。

             dp[i][v]=max{ f[i-1][v],f[i-1][ v-w[i] ]+c[i] }

 

完全背包: 1~n种(类)物品,每种物品无限多件。
             
dp[i][v]表示,前i种物品(多件)放入一个容量为V的背包可以获得的最大价值。

             dp[i][v]=max{ f[i-1][v],f[i][ v-w[i] ]+c[i] }

            和0/1背包本质区别:外循环从f[i-1]变成了f[i], 也就是每种物品多循环了i次——使得内循环多跑了一圈《==》对应n类物品。

 

多重背包: n种(类)物品,第i种物品最多有n[i]件可用,求放入V容量背包最大价值。
        区别前2种背包:①多重:增加了一重循环k,成了三重循环。
                                   ②每种物品费用是k*w[i]、价值为k*c[i] 

                 dp[i][v]=max{ f[i-1][ v-k*w[i] ]+k*c[i] | 0<=k<=n[i] }

多重背包的三重循环框架为:
            

for(int i=1;i<=n;i++) //i物品 
  for(int v=m;v>=0;v++) //空间 
    for(int k=0;k<=n[i];k++)  
        {
          if(j-k*c[i]<0) break;
          dp[i][v]=f[i-1][ v-k*w[i] ]+k*c[i];
        }
        
        

 

 

 

 



posted on 2021-03-04 08:27  lcdxjsj  阅读(189)  评论(0)    收藏  举报

导航