题目描述
解法:完全背包
唯一和完全背包问题不同就是,总金额的数目是在变动的,因此,我们在完全背包问题循环的外面再套上一层循环用于更新总金额
#include <bits/stdc++.h>
using namespace std;
int main()
{
int s, n, d, a, b;
cin >> s >> n >> d;
vector<pair<int, int>> bond(51);
vector<int> dp(10000000, 0);
for(int i=1;i<=d;i++)
cin >> bond[i].first >> bond[i].second;
for(int t=0;t<n;t++)
{
for(int i=1;i<=d;i++)
for(int j=bond[i].first;j<=s;j++)
dp[j] = max(dp[j], dp[j-bond[i].first]+bond[i].second);
s += dp[s];
}
cout << s;
return 0;
}