01背包问题,完全背包问题的二维数组,一维数组的解答

关于01背包问题,完全背包问题,这里就不过多阐述。这里只是总结一下这两个问题的二维数组,一维数组的两种表达方式。

为什么要用一位数组,两个原因:1.节约空间(二维变一维)2.时间复杂度降为线性。

直接上代码,如果对01背包问题,完全背包问题有问题的推荐看一下《背包九讲》和其他博客。

  1. 背包九讲:https://github.com/tianyicui/pack
  2. 01背包问题可视化的网站:http://karaffeltut.com/NEWKaraffeltutCom/Knapsack/knapsack.html
    (这个是真的好用,你只要输入条件就给你画出所有的情况)
  3. 挺详细的一个博客:https://blog.csdn.net/na_beginning/article/details/62884939

切入正题,进行代码总结:

01背包问题:

二维数组:

void FindMax()//动态规划
 {
     int i,j;
     //填表
     for(i=1;i<=number;i++)
     {
         for(j=1;j<=capacity;j++)
         {
             if(j<w[i])//包装不进
             {
                 V[i][j]=V[i-1][j];
             }
             else//能装
             {
                 if(V[i-1][j]>V[i-1][j-w[i]]+v[i])//不装价值大
                 {
                     V[i][j]=V[i-1][j];
                 }
                 else//前i-1个物品的最优解与第i个物品的价值之和更大
                 {
                     V[i][j]=V[i-1][j-w[i]]+v[i];
                 }
             }
         }
     }
 }

一维数组:

 void FindMaxBetter()//优化空间后的动态规划
 {
    int i,j;
    for(i=1;i<=number;i++)
   {
         for(j=capacity;j>=w[i];j--)
         {
            if(B[j]<=B[j-w[i]]+v[i])//二维变一维
            {
                B[j]=B[j-w[i]]+v[i];
            }
         }
     }
 }

在背包九讲里面给出一个小tip:
求恰好装满背包,初始化B[0] = 0,其他都是-∞。
若是求最大价值,初始化B[0-N]都是0。

完全背包问题:

多了个任何物体都可以无限用的条件。

二维数组:(与01背包问题不同在代码里标出)

void FindMax()//动态规划
 {
     int i,j;
     //填表
     for(i=1;i<=number;i++)
     {
         for(j=1;j<=capacity;j++)
         {
             if(j<w[i])//包装不进
             {
                 V[i][j]=V[i-1][j];
             }
             else//能装
             {
                 if(V[i-1][j]>V[i][j-w[i]]+v[i])//不装价值大
                 {
                     V[i][j]=V[i-1][j];
                 }
                 else//这里与01有不同之处,其他一样
                 {
                     V[i][j]=V[i][j-w[i]]+v[i];
                 }
             }
         }
     }
 }

一维数组:(跟01背包有点不同是正着来,切从w[i]开始)

void FindMaxBetter()//优化空间后的动态规划
 {
    int i,j;
    for(i=1;i<=number;i++)
   {
         for(j=w[i];j<=capacity;j++)
         {
            if(B[j]<=B[j-w[i]]+v[i])//二维变一维
            {
                B[j]=B[j-w[i]]+v[i];
            }
         }
     }
 }    
  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值