三种基本背包【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]; }
浙公网安备 33010602011771号