投资债券,给出初始资金,固定的年限,债券的面值及每年的收益,每种债券可以无限买,求在给定年限内的最大收益
完全背包问题,需要注意的是收益是利滚利,要每年算一次,把每年的收益再作为本金投资。
Source Code:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 20;
const int maxm = 2000000 + 10;
int cas; //case
int ye; //年限
int n; //债券种数
int stsum; //本金总和
int val[maxn]; //债券面值
int interest[maxn]; //债券利润 / 年
int dp[maxm];
int tmp;
void bagdp()
{
for( int i = 0; i <= tmp; i++ )
dp[i] = 0;
for( int i = 1; i <= n; i++ )
{
for( int j = 0; j <= tmp; j++ )
{
if( j >= val[i] )
dp[j] = max( dp[j], dp[j-val[i]] + interest[i] );
}
}
}
int main()
{
scanf( "%d", &cas );
while( cas-- )
{
scanf( "%d%d%d", &stsum, &ye, &n );
for( int i = 1; i <= n; i++ )
{
scanf( "%d%d", &val[i], &interest[i] );
val[i] /= 1000;
}
for( int i = 0; i < ye; i++ )
{
tmp = stsum / 1000;
bagdp();
stsum += dp[tmp];
}
printf( "%d\n", stsum );
}
return 0;
}