01背包问题动态规划-atao

01背包类似问题一般是给3个参数

1:sum 背包总重量

2:w[]数组, 数组每个数为单个物品重量

3:v[]数组,每个数为单个物品价值,

一般就是要求在背包能装得下的情况下,保证价值最大。

核心思路: 就是1个物品和背包总重量为1~总重量为sum的情况下获得的最大价值, 以此轮询,  在背包总重量为sum的最大价值求出来后再轮询2个物品 总重量为1~总重量为sum的情况下获得的最大价值。不断轮询 直到获得n个物品下背包总重量为su'm的最大价值,   接下来我以自己个人的理解讲解这个思路的原理:

                首先我要拿到n个物品下背包总重量为sum的最大价值, 就要进行判断第n个物品放进来的必要性,比如说第n个物品的重量大于sum,那么肯定就放不下,那么 我的目的就变成了求n-1个物品下背包总重量为sum的最大价值,

如果第n个物品的重量是小于等于sum的话我就考量一下,放进来是否比原先不放进来的价值要大。如果不是,那我也没必要放。如果是, 那么 我就要腾出第n个物品所占的重量空间,然后再把第n个物品放进去,另外要重点注意,我腾出第n个物品所占的空间时,状态就是n-1个物品下背包总重量为sum-w[n]的情况下所能获得的最大价值 。思路到了这里就已经很清晰了,   所以为了求n个物品下背包总重量为sum的最大价值,我们就必须求出n-1个物品下总重量为 sum的最大价值,以及背包还剩sum-w[n]情况下的最大价值。这样层层递推下来就发现不得不把1~n个物品和1~sum重量情况下的最大价值求出来.

    dp[i][j]的核心判断就是1: 装得下第i件物品, 然后判断值不值得装

                                        2:装不下  

   贴出代码如下,   测试数据可以如下

40

11 12 23 36

11 11 20 30

最后得出的数据即为所求的最大价值。

另外 华为机试的一道编程题还要求求出最大价值时所取的物品

我的思路是这样的 

 

就是说最后一排的最大数字如果和上一排的数字一样 说明这个物品多余, 如果不一样说明这个物品不多余,不多余以后我就用sum-这个物品的重量,   然后再求dp[--a][sum-w[this]] 又按照同样的方法进行循环 代码如上图

  

猜你喜欢

转载自blog.csdn.net/qq_38835878/article/details/79825965