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;
}
}
}
}
没有修改了
这就是正解