01背包问题,直接用dp写。不过我感觉其实记忆话搜索更好理解。
#include <iostream>
const int MAX = 1e4 + 5;
int dp[105][MAX];
int w[MAX], p[MAX];
int main()
{
int n, W;
std::cin >> n >> W;
for (int i = 1; i != n + 1; ++i)
{
std::cin >> w[i] >> p[i];
}
for (int i = 1; i <= n; ++i)
{
for (int j = 0; j <= W; ++j)
{
if (j < w[i])
dp[i][j] = dp[i - 1][j];
else
{
dp[i][j] = std::max(dp[i - 1][j], dp[i - 1][j - w[i]] + p[i]);
}
}
}
std::cout << dp[n][W] << std::endl;
return 0;
}