本金和利息都是1000的倍数所以可以除以1000来压缩数组的大小,这道题算简单,典型的完全背包
用了三重循环,从第一种债券开始看起,背包大小从最小也就是当前选的债券的值一直增加到当前本金的值,填入每个位置可获得的最大利息。状态转移方程就是dp[j] = max(dp[j], dp[j - bonds[k]/1000] + interting[k]);就很容易写出来了
记得每一年都更新一下本金的数目;
#include<iostream>
#include<string.h>
using namespace std;
int dp[100000];
int main ()
{
int t; //一开始的总存款额度
int n; //测试数据的个数
int y; //存几年
int tim; //共有几种存款方案
int bonds[11], interting[11];
int temp; //当前总可用额度
cin >> n;
while(n--)
{
cin >> t;
cin >> y;
cin >> tim;
temp = t;
for(int i = 0; i < tim; ++i)
{
cin >> bonds[i];
cin >> interting[i];
}
for(int i = 0; i < y; ++i) //遍历年份
{
memset(dp, 0, sizeof(dp)); //便利债券
for(int k = 0; k < tim; ++k)
for(int j = bonds[k]/1000; j <= temp/1000; ++j) //遍历背包
dp[j] = max(dp[j], dp[j - bonds[k]/1000] + interting[k]);
temp += dp[temp/1000]; //更新本金数值
}
cout << temp <<endl;
}
return 0;
}