初理解0-1背包问题

文章介绍了0-1背包问题,即在物品质量和价值给定的情况下,如何在总重量限制下选择物品以最大化总价值。通过对比暴力枚举的高时间复杂度,文章详细阐述了利用动态规划算法来解决此问题的方法,包括定义二维数组dp[i][j]的含义,以及如何通过递推关系构建解决方案。最后,文章给出了一个具体的Java实现示例及运行结果,证明算法的正确性,其时间复杂度为O(N^2)。
摘要由CSDN通过智能技术生成

  0-1背包问题通常可以归纳为:给定一些确定价值与质量的物品,在规定的总重量的约束条件下,合理的选择使得选择的物品使得总价值最大。

  对这个问题进行分析,如果使用暴力枚举的方法,每一个物品有两种可能,不妨令物品是否在背包中的状态为 

                       

  对于这种情况而言,它的暴力解法需要的时间复杂度是O(2^n),因此,下面介绍使用动态规划的算法来对这个背包问题进行解决。

  首先,我们先定义一个二维数组:dp[ i ][ j ],这个二维数组我们赋予它的意义为:限重为j的情况下,放入前面i个物品的最大价值。

  当我们开始考虑这件物品是否需要放下的情况时,会出现两种不同的情况:

  1.不放入第i件物品。

  2.在可以放下的前提下,放入第i件物品。

  然后,我们可以思考dp[ i ][ j ]与dp[ i-1 ][ j ]和dp[ i-1 ][ j-weight ]+value的关系。

  毫无疑问,dp [ i ][ j ]=max(dp[ i-1 ][ j ],dp[ i-1 ][ j-weight ]+value).

  得到递推关系后,我们再开始进行对dp[ ] [ ]数组进行初始化。

  当i=0,1,2...n,j=0时,dp[ i ][ j ]=0。这种情况代表了允许放入重量为0时的情况。毫无疑问,这种情况下dp[ i ][ j ]=0。当i=0时,i-1<0,无法进行计算。所以我们根据实际来规定——dp[0][j]的值当j>=weight[0]时,dp[0][j]=value(0),即当允许的重量大于等于第0个物品的重量时,dp[i][j]的值为第0个货物的价值。

  下面用一个具体的问题来具体分析。

  假设一群宝石的质量和价值如下图所示:

  并规定背包允许放下的最大重量为9。我们可以通过递推公式画出表格: 

  

具体的java实现:

package test;

public class dps {
    public static void main(String args[])
    {
  int []value= {1,2,3,4};
  int []weight= {2,3,4,5};
  int bigweight=9;
  int [][]dp; dp=new int[value.length][bigweight+1]; 
  for(int i=0;i<value.length;i++)
  {
      dp[i][0]=0;
  }
  for(int j=weight[0];j<bigweight+1;j++)
  {
      dp[0][j]=value[0];
  }
  for(int i = 1; i < value.length; i++) { // 遍历物品
      for(int j = 0; j <= bigweight; j++) { // 遍历背包容量
          if (j < weight[i]) dp[i][j] = dp[i - 1][j];
          else dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
      }
  }
           for(int i1=0;i1<value.length;i1++)
          {
          for(int j=0;j<bigweight+1;j++)
          {
              System.out.print(dp[i1][j]);
          }System.out.print("\n");
          }
          }
    }

  具体的运行结果如图所示:

与上图的表格一致,说明算法无误。 时间复杂度为O(N^2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值