题目大意:John总共有钱cash ,可以用于投资,一共有m种方案,每次投资后的本金和可再次用于投资,求多次投资后最大的本金和
解题算法:完全背包问题,注意题目细节问题,容易出错!
#include<stdio.h>
#include<string.h>
const int max_size=100001;
double dp[max_size],v[max_size];
int c[max_size/5];
int cases,yeas,m,cash,ca;
void Dp()
{
int i,j;
for(i=0;i<m;i++)
for(j=c[i];j<=ca;j++)
if(dp[j-c[i]]+v[i]>dp[j])
dp[j]=dp[j-c[i]]+v[i];
}
void work()
{
int cc,vv;
scanf("%d",&cases);
while(cases--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d%d",&cash,&yeas,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&cc,&vv);
c[i]=cc/1000;
v[i]=(double)(vv)/1000;
}
while(yeas--)
{
ca=cash/1000;
//printf("%d\n",ca);
Dp();
//printf("%lf\n",dp[ca]*1000);
cash+=(int)(dp[ca]*1000.0+0.1);
// printf("%d %lf\n",cash,dp[ca]);
}
printf("%d\n",cash);
}
}
int main()
{
work();
return 0;
}