【算法】01背包问题

01背包问题

什么是01背包问题

     01背包问题得名于其性质:一个物品放进一个背包只有取和不取两种选择,取就是1,不取就是0,便得名01背包。
     模板题目:有n个物品,放进一个容量v的背包中,求出其最小剩余量是多少。
     这就是非常典型的01背包问题,那么如何实现呢?
     我们可以定义一个数组dp[v]来表示当容量为v时是否存在解,设item为当前决策中物品,易得dp[j]=max(dp[j-item],dp[j]),假设我们有一个容量为6的背包,有1、3、5三个物品,就有这段代码:

void dp_01()
{
    int i,j;
    dp[0]=1;
    for(i=1;i<=totitem;++i)
    {
        for(j=item[j];j<=weight;--j)
        {
            if(dp[j-item[i]]==true)
            {
                dp[j]=true;
            }
        }
    }
}

模拟01背包问题+纠错

好的咱们跑一遍
这里写图片描述
选择1为当前物品,可以更改dp[1]
这里写图片描述
等等?dp[2-1]=1?dp[2]也可以等于1?怎么可能?
这里写图片描述
好吧,因为咱们的循环出了点问题,把之前做过的决策又当了证据了。因此只要改一下代码:

正解

void dp_01()
{
    int i,j;
    dp[0]=1;
    for(i=1;i<=totitem;++i)
    {
        for(j=weight;j>=item[j];--j)
        {
            if(dp[j-item[i]]==true)
            {
                dp[j]=true;
            }
        }
    }
}

这里写图片描述
没有修改了
这就是正解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值