开门见山
01背包问题有两种写法,一种是开二维数组记录状态,一种是只开一维数组记录状态。
二维数组:
for(i = 1;i<n;i++)
{
for(j = m;j>=1;j--)
{
if((j-value[i])>=0)
{
dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+value[i]);
}
else dp[i][j] = dp[i-1][j];
}
}
第二个for循环也可以依次加来遍历
for(i = 1;i<n;i++)
{
for(j = 1;j<=m;j++)
{
if((j-value[i])>=0)
{
dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+value[i]);
}
else dp[i][j] = dp[i-1][j];
}
}
一维数组
for(i = 0;i<n-1;i++)
{
for(j = m;j>=w[i];j--)
{
dp[j] = max(dp[j],dp[j-w[i]]+value[i]);
}
}
一维数组的第二个for循环必须依次减
原因
后面填坑,今天有点忙