完全背包:
void solve()
{
for(int i=0;i<n;i++)
for(int j=0;j<=m;j++)
if(j<w[i])
{
dp[i+1][j]=dp[i][j];
}
else
{
dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i]);
}
printf("%d\n",dp[n][m]);
}01背包:
int dp[MAX_N+1][MAX_W+1]
void solve()
{
for(int i=n-1;i>=0;i--)
for(int j=0;j<=W;j++)
if(j<w[i])
{
dp[i][j]=dp[i+1][j];
}
else
{
dp[i][j]=max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]);
}
printf("%d\n",dp[0][w]);
}
本文详细介绍了两种常见的背包问题——01背包与完全背包的解决方法,通过具体的代码实现展示了如何求解最大价值。针对每种背包问题的特点,给出了迭代的状态转移方程,并提供了完整的C/C++代码示例。
1257

被折叠的 条评论
为什么被折叠?



