【算法】01背包问题

来源:互联网 发布:300mw机组造价数据 编辑:程序博客网 时间:2024/05/17 08:09

01背包问题

  • 01背包问题
    • 什么是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;            }        }    }}

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

原创粉丝点击