01背包多种解法
1. 状态转移方程:
dp[i][j] = dp[i + 1][j] -------------( j < we[i] )
dp[i][j] = max( dp[i + 1][j] , dp[i + 1][j - we[i] ] +va[i]) ------其他情况
从第i个物品开始挑选总重小于j时,总价值最大。dp[0][v]就是答案。
代码如下:
void solve()
{
for(int i = n - 1; i >= 0; i--)
{
for(int j = 0; j <= v; j++)
{
if(j < we[i])
dp[i][j] = dp[i + 1][j];//无法取第i个物品的情况
else
{
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - we[i]] + va[i]);
}
}
}
printf("%d\n", dp[0][v]);
}
1. 状态转移方程:
dp[i + 1][j] = dp[i][j] -------------( j < we[i] )
dp[i + 1][j] = max( dp[i][j] , dp[i][ j - we[i] ] + va[i])
dp[0][j] = 0;
从前i个物品中选出总重量不超过j的物品时总价值的最大值。
代码如下:
void solve()
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j <= v; j++)
{
if(j < we[i])
dp[i + 1][j] = dp[i][j];//无法取第i个物品的情况
else
{
dp[i + 1][j] = max(dp[i][j], dp[i][j - we[i]] + va[i]);
}
}
}
printf("%d\n", dp[n][v]);
}