背包问题一般采用DP(动态规划)来解决。
背包问题可分为0-1背包问题和完全背包问题。
一、 0-1背包问题表示所有物品只有一件,我们可以推导出放入背包的物品最大价值公式为
dp[i][j] = Math.max(dp[i-i][j],dp[i-1][j-wi]+vi),意思就是当前物品放入的最大价值要么是不放入当前物品,要么是放入当前物品。不放入当前物品的价值就是上一轮计算出来的j的空间的最大的价值。放入当前物品i,表示上一轮的j的空间减去物品i的空间对应的价值,再加上当前物品的价值。
遍历的时候,一般把物品i放在外层,资源空间j放在里层。
dp表示放入i件物品所需要j空间,所有物品的价值,wi标识i物品的体积,vi标识i物品的价值。
二维dp公式可以转化为一维dp公司,这个转化是没有业务意义的,是数学上的转化,可以推导或者记住。
01背包一维dp公式如下:
dp[j] = Math.max(dp[j],dp[j-wi]+vi) 其中i表示第i个物品,dp[j]表示第j空间最大的价值,wi标识物品i的体积,vi标识物品i的价值。这里的内层循环的j要大于wi,不然会越界。
二、完全背包问题:
完全背包问题是指每个物品都有无数个,然后其他条件不变。
二维dp公式如下:
dp[i][j] = Matn.max( dp[i-1][j] , dp[i][j-wi] + vi );
注意这里第一个是dp[i][j]本身,第二个是dp[i][j-wi]+vi ,和01还是有点区别的。这里的j也要大于wi,不然也会越界。
这个公式是没有业务意义的,是纯数学方法推导出来的。
完全背包问题dp公式也可以转化为一维公式:
dp[j] = Matn.max( dp[j] , dp[j-wi]+vi )
这里也纯粹是数学推导,没有什么业务含义。
380

被折叠的 条评论
为什么被折叠?



