从0-1背包 到完全背包
完全背包问题 :从01背包说起。
01背包:N件物品,容量为V;第i件物品费用(体积)W[i],价值c[i]。求最大价值。
分析: 第i件物品装1/不装0,故为01背包。
状态方程:f[i][v]=max( f[i-1][v],f[i-1][v-w[i]]+c[i]);
核心代码:
for(i=1;i<=n;i++)
for(v=m;v>0;v--) //m=10初值
if(w[i]<=v) f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i]); //有空间:比较选择
else f[i][v]=f[i-1][v]; //当前i没选,返回之前最大价值
cout<<f[n][m] 就是最优解!
白书351页,9.12 0-1背包问题
【输入】背包容量M=10,物品 n=4 【输出】12


分析i=4, v=10 的情况。
if(w[i]<=v) f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i]); //有空间:比较选择
else f[i][v]=f[i-1][v]; //当前i没选,返回之前最大价值
上述代码为: w4<=10 :7<10 成立。
f(4,10)=max{ f(3,10), f(3,10-w4)+c4 ) } //10-w4=3
=max{ 9 , f(3,3)+9 } =max { 9, 3+9} = max{9 , 12} = 12 //请大家自行完成后面的填空
完全背包:N件物品,容量为m;第i件物品费用(体积)W[i],价值c[i]。求最大价值。
并且没有物品无限可用——其实就是有无限多的i种类物品。
分析: 第i种物品 有多个,每件物品空间v
状态方程:f[i][v]=max( f[i-1][v],f[i-1][v-w[i]]+c[i]); //同01背包相同
核心代码:for(i=1;i<=n;i++)
for(v=1;v<=m;v++)
if(v< w[i]) f[i][v]= f[i-1][v]; //当前容积不如,返回上一步
else
if( f[i-1][v]>f[i][v-w[i]]+c[i] ) f[i][v]= f[i-1][v]; //上一步大于当前,用上一步
else f[i][v]= f[i][v-w[i]]+c[i]; //放入当前(累加放入) ,解决i种多个。
//f[i]表示本种物品取多个
白书353页,9.12 完全背包问题
【输入】背包容量M=10,物品 n=4 【输出】12

请同学们,结合代码 补全后面的表格。
信息学奥赛
完全背包问题 :从01背包说起。
01背包:N件物品,容量为V;第i件物品费用(体积)W[i],价值c[i]。求最大价值。
分析: 第i件物品装1/不装0,故为01背包。
状态方程:f[i][v]=max( f[i-1][v],f[i-1][v-w[i]]+c[i]);
核心代码:
for(i=1;i<=n;i++)
for(v=m;v>0;v--) //m=10初值
if(w[i]<=v) f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i]); //有空间:比较选择
else f[i][v]=f[i-1][v]; //当前i没选,返回之前最大价值
cout<<f[n][m] 就是最优解!
白书351页,9.12 0-1背包问题
【输入】背包容量M=10,物品 n=4 【输出】12
|
(V)每个物品重量Wi |
每个物品价值Ci |
|
|
物品1 |
W1=2 |
C1=1 |
|
物品2 |
W2=3 |
C2=3 |
|
物品3 |
W3=4 |
C3=5 |
|
物品4 |
W4=7 |
C4=9 |
|
F[i][v]最大价值 |
V=10 |
V=9 |
V=8 |
V=7 |
V=6 |
V=5 |
V=4 |
V=3 |
V=2 |
V=1 |
|
物品i=1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
|
物品i=2 (第2次内循环) |
f(1,7)+3 4 |
f(1,6)+3 4 |
f(1,5)+3 4 |
f(1,4)+3 4 |
f(1,3)+3 4 |
f(1,2)+3 4 |
f(1,1)+3 4 |
3 |
1 |
0 |
|
物品i=3 (第3次内循环) |
f(2,10-4)+5 |
f(2,9-4)+5 |
f(2,8-4)+5 |
f(2,7-4)+5 |
f(2,6-4)+5 |
f(2,5-4)+5 |
else |
else |
同左 |
0 |
|
物品i=4 |
12 |
|
|
|
|
|
|
|
|
|
分析i=4, v=10 的情况。
if(w[i]<=v) f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i]); //有空间:比较选择
else f[i][v]=f[i-1][v]; //当前i没选,返回之前最大价值
上述代码为: w4<=10 :7<10 成立。
f(4,10)=max{ f(3,10), f(3,10-w4)+c4 ) } //10-w4=3
=max{ 9 , f(3,3)+9 } =max { 9, 3+9} = max{9 , 12} = 12
完全背包:N件物品,容量为m;第i件物品费用(体积)W[i],价值c[i]。求最大价值。
并且没有物品无限可用——其实就是有无限多的i种类物品。
分析: 第i种物品 有多个,每件物品空间v
状态方程:f[i][v]=max( f[i-1][v],f[i-1][v-w[i]]+c[i]); //同01背包相同
核心代码:for(i=1;i<=n;i++)
for(v=1;v<=m;v++)
if(v< w[i]) f[i][v]= f[i-1][v]; //当前容积不如,返回上一步
else
if( f[i-1][v]>f[i][v-w[i]]+c[i] ) f[i][v]= f[i-1][v]; //上一步大于当前,用上一步
else f[i][v]= f[i][v-w[i]]+c[i]; //放入当前(累加放入) ,解决i种多个。
//f[i]表示本种物品取多个
白书353页,9.12 完全背包问题
【输入】背包容量M=10,物品 n=4 【输出】12
|
(V)每个物品重量Wi |
每个物品价值Ci |
|
|
物品1 |
W1=2 |
C1=1 |
|
物品2 |
W2=3 |
C2=3 |
|
物品3 |
W3=4 |
C3=5 |
|
物品4 |
W4=7 |
C4=9 |
|
F[i][v]最大价值 |
V=1 |
V=2 |
V=3 |
V=4 |
V=5 |
V=6 |
V=7 |
V=8 |
V=9 |
V=10 |
|
物品i=1 |
0 |
1 |
1
|
f(1,2)+c1 |
f(1,3)+c1 |
f(1,4)+c1 |
f(1,5)+c1 |
f(1,6)+c1 |
f(1,7)+c1 |
f(1,8)+c1 |
|
物品i=2 (第2次内循环) |
f(i-1,v) |
↓1 |
3 |
f(2,1)+c2 0+3=3 |
f(2,2)+c2 |
f(2,3)+c2 |
f(2,4)+c2 |
f(2,5)+c2 |
f(2,6)+c2 |
f(2,7)+c2 |
|
物品i=3 (第3次内循环) |
|
|
|
|
|
|
|
|
|
|
|
物品i=4 |
|
|
|
|
|
|
|
|
|
|
请同学们,结合代码 补全后面的表格。
浙公网安备 33010602011771号