这是01背包的变种题目,只要把状态转移方程改为
dp[j] = max(dp[j],dp[j - v[i]] + w[i] * v[i]);
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e4+10;
int v[N],w[N];
ll dp[N];
int n,m;
void run()
{
cin >> n >> m;
for(int i = 1; i <= m; i ++)
cin >> v[i] >> w[i];
for(int i = 1; i <= m; i ++)
{
for(int j = n; j >= v[i]; j --)
{
dp[j] = max(dp[j],dp[j - v[i]] + w[i] * v[i]);
}
}
cout << dp[n] << endl;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
run();
return 0;
}