这道题就是需要每年都进行一次动态规划,然后直接套完全背包即可
因为本金有可能很大,所以这里面有一个简易的状态压缩,因为本金和价格都是的1000倍数,可以将其都除以1000;
#include<stdio.h>
#include<string.h>
int max( int a, int b){return a > b ? a : b;}
int main(void){
int t, j, i, y, num, basic, year;
int dp[200005], value[20], profit[20], sum;
scanf("%d", &t);
while(t--){
scanf("%d%d", &basic, &year);
scanf("%d", &num);
for( i = 1; i <= num; i++){
scanf("%d%d", &value[i], &profit[i]);
value[i] /= 1000;
}
for( y = 1; y <= year; y++){
sum = basic / 1000; // 状态压缩
memset( dp, 0, sizeof(dp));
for( i = 1; i <= num; i++){
for( j = value[i]; j <= sum; j++)
dp[j] = max( dp[j], dp[j-value[i]]+profit[i]);
}
basic += dp[sum];
}
printf("%d\n", basic);
}
return 0;
}