标签:复杂度 维数 span 简单的 空间复杂度 size 大神 color 二维
背包问题动态规划中非常经典的一个问题,本文只包含01背包,完全背包和多重背包。更加详尽的背包问题的讲解请参考崔添翼大神的《背包九讲》
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1; i<=n; i++)
{
for(int j=p; j>=v[i]; j--)
{
if(dp[i-1][j-v[i]] || dp[i-1][j])
{
dp[i][j] = 1;
}
}
}
int ans;
for(int i=p; i>=0; i--)
{
if(dp[n][j])
{
ans = j;
break;
}
}
注意代码中从后向前更新dp[i][j],是为了防止一件物品被使用多次
显然,在简单01背包问题中,空间复杂度达到了O(n*p)之多。而在每一次更新第i行的数据时,只需要i-1行的数据即可,再向上的数据完全可以舍弃,所以只需要开一个两行的二维数组即可。
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1; i<=n; i++)
{
for(int j=p; j>=v[i]; j--)
{
if(dp[0][j-v[i]] || dp[0][j])
{
dp[1][j] = 1;
}
}
for(int i=0; i<=n; i++)
{
dp[0][i] = dp[1][i];
}
}
int ans;
for(int i=p; i>=0; i--)
{
if(dp[1][j])
{
ans = j;
break;
}
}
未完待遇……
标签:复杂度 维数 span 简单的 空间复杂度 size 大神 color 二维
原文地址:https://www.cnblogs.com/sdutzxr/p/12219567.html