背包九讲 0—1背包问题

                                                                背包九讲第一章

                0—1背包问题

转移方程

其中v[i]代表i件物品的质量,w[i]代表i件物品的价值。

f[i][j] = max{f[i - 1][j], f[i - 1][ j - v[i] ] + w[i]}

举个栗子!

假设我们有两个物品:

序号           1            2             3

V(质量)       2           3              5

W(价值) 5           8             12

好!假设我们现在有个背包,背包的容量为5,问最多能装下的价值是多少?

由于作者不会制图,弄个excel大家看看吧,黄色的表格代表拿去这件物品,白色表格表示不拿取。

如果:大家细心的话,应该发现这明明就是个递归问题,所以我们可以运用动态规划去优化这个递归树,至于如何将递归树转化为动态规划的二维数组我就不在这做详解了(作者承认现在作者也不知道如何去描述这个问题)。(就是自己明白但是说不出,呜呜~~)

其实要是改成递归去做我觉得大家可能更好理解

Find(i , j) = max ( F(i - 1, j) , F(i - 1)( j - v[i]) + w[i])

这个题目每一步我们都有两种选择,要么拿取第这件物品,要么不拿这件物品。

如果拿取:f[i][j] = f[i - 1][j - v[i] ] + w[i]

如果不拿:f[i][j] = f[i - 1][j]

//核心代码:

for(int i = 1; i <= n(物品数量); ++i)

    for(int j = 0; j <= m(物品质量); ++j)

    {

        f[i][j] = f[i - 1][j];

        if(j >= v[i])

            f[i][j] = f[i - 1][j - v[i] ] + w[i];

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值