从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,6)+5
4+5=9

f(2,9-4)+5
f(2,5)+5
4+5=9

f(2,8-4)+5
f(2,4)+5
4+5=9

f(2,7-4)+5
f(2,3)+5
3+5=8

f(2,6-4)+5
f(2,2)+5
1+5=6

f(2,5-4)+5
f(2,1)+5
0+5=5

else
=f(i-1,v)
f(2,4)=4

else
=f(i-1,v)
f(2,3)=3

同左
f(2,1)
=1

0

物品i=4
(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
1+1=
2

f(1,3)+c1
1+1=
2

f(1,4)+c1
2+1=
3

f(1,5)+c1
2+1=
3

f(1,6)+c1
3+1=
4

f(1,7)+c1
3+1=
4

f(1,8)+c1
4+1=
5

物品i=2

(2次内循环)

f(i-1,v)
f(1,1)0

1

3

f(2,1)+c2

0+3=3

f(2,2)+c2
1+3=4

f(2,3)+c2
3+3=6

f(2,4)+c2
3+3=6

f(2,5)+c2
4+3=7

f(2,6)+c2
6+3=9

f(2,7)+c2
6+3=9

物品i=3

(3次内循环)

 

 

 

 

 

 

 

 

 

 

物品i=4
(4次内循环)

 

 

 

 

 

 

 

 

 

 

 

 

请同学们,结合代码 补全后面的表格。

 

posted on 2020-09-16 17:42  lcdxjsj  阅读(86)  评论(0)    收藏  举报

导航