记忆化搜索与动态规划
题目:n个重量和价值分别为 wi, vi的物品。从这些物品中挑选出总重量不超过W的物品。求所有挑选方案中价值总和的最大值。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10000 + 50;
int n, W;
int w[maxn], v[maxn];
int dp[maxn][maxn];
/*
4
2 3 1 2 3 4 2 2
5
*/
void solve()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= W; 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]);
}
}
}
cout << dp[n][W] << endl;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> w[i] >> v[i];
}
cin >> W;
memset(dp, 0, sizeof(dp));
solve();
return 0;
}