代码随想录算法训练营第四十二天 | 01背包问题

背包理论基础

01 背包(二维数组)

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

背包最大重量为4,其中物品为:

重量 价值
物品0 1 15
物品1 3 20
物品2 4 30

需要求背包能背的物品最大值为多少?

动规五部曲:

  1. 确定dp数组以及下标的函数

定义一个二维数组dp[i][j]表示下标从[0,i]的物品里任取,放进容量为j的背包当中,背包的价值总和为dp[i][j]

代码随想录算法训练营第四十二天 | 01背包问题_第1张图片

  1. 确定递推公式

①不放物品i:可以由dp[i-1][j]退出,背包里面没有放物品i,所以仍然为前一个的价值

②放物品i:可以由dp[i-1][j-weight[i]]推出,价值为dp[i-1][j-weight[i]]+value[i]

所以递归公式可以总结为dp[i][j]=max(dp[i-1][j],(dp[i-1][j-weight[i]]+value[i]))

  1. dp数组初始化

①当j=0的时候dp[j][0]=0

代码随想录算法训练营第四十二天 | 01背包问题_第2张图片

②由递归公式可知dp[i]需要依赖dp[i-1]所以我们需要确定dp[0][j]

当j

当j≥weigh[0]的时候,dp[0][j]=value[0]

代码随想录算法训练营第四十二天 | 01背包问题_第3张图片

  1. 确定遍历顺序

先遍历物品i,在遍历背包重量j

  1. 距离推导dp数组

代码随想录算法训练营第四十二天 | 01背包问题_第4张图片

最终结果为dp[2][4]

  public int testWeightBagProblem(int[] weight, int[] value, int bagSize){
   
        int[][] dp=new int[weight.length][bagSize+1];
        //初始化数组,将背包数量大于物品0的赋值物品0的value,其他的默认为0
        for(int i=weight[0];i<=bagSize;i++){
   
            dp[0]

你可能感兴趣的:(算法,动态规划,数据结构)