题目
分析
简单01背包问题。但要注意一个问题,就是在使用dp[i + 1][j] = dp[i][j]时,w[i]与v[i]时,下标应该从0开始,而使用dp[i][j] = dp[i-1][j]时w[i]与v[i]应该从1开始,这样可以防止越界。
代码①
#include <iostream>
#include <cstdio>
using namespace std;
int v[30], w[30], dp[30][30005];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
scanf("%d%d", &w[i], &v[i]);
v[i] *= w[i];
}
for (int i = 0; i < m ; i++)
{
for (int j = 0; j <= n; j++)
{
if (j < w[i])
{
dp[i + 1][j] = dp[i][j];
}
else
{
dp[i + 1][j] = max(dp[i][j], dp[i][j - w[i]] + v[i]);
}
}
}
printf("%d\n", dp[m][n]);
return 0;
}
代码②
#include <iostream>
#include <cstdio>
using namespace std;
int v[30], w[30], dp[30][30005];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &w[i], &v[i]);
v[i] *= w[i];
}
for (int i = 1; i <= m; i++)
{
for (int j = 0; j <= n; 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[m][n]);
return 0;
}