算法学习之-DP背包问题

背包问题一般采用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 )

这里也纯粹是数学推导,没有什么业务含义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值