题目大意:有M的钱,要将这M的钱拿去存储,给出N种存储方式,存储方式为,存K元一年,获利P元
现在要将这些钱存Y年(可以每年的存储方式都不同,获利的钱,可以接着使用),问Y年后的能得到的钱的最大值
解题思路:按年来进行背包,背包的容量为现有钱的最大值。求出每一年能获得的最大值,然后累加上去(因为每年的存储方式都可以不同),继续背包
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 400010;
struct Bound {
int cost, val;
}B[20];
int n, year, d;
int dp[N];
void init() {
scanf("%d%d%d", &n, &year, &d);
for (int i = 0; i < d; i++) {
scanf("%d%d", &B[i].cost, &B[i].val);
B[i].cost /= 1000;
}
}
void solve() {
memset(dp, 0, sizeof(dp));
for (int i = 0; i < year; i++) {
int t = n / 1000;
int Max = 0;
for (int j = 0; j < d; j++) {
for (int k = B[j].cost; k <= t; k++) {
dp[k] = max(dp[k], dp[k - B[j].cost] + B[j].val);
Max = max(Max, dp[k]);
}
}
n += Max;
}
printf("%d\n", n);
}
int main() {
int test;
scanf("%d", &test);
while (test--) {
init();
solve();
}
return 0;
}