思路:
因为每年存款的利息不变,所以第二年的本金是第一年的本息和,以此类推
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<set> #include<vector> #include<map> #include<algorithm> #include<cmath> #include<stdlib.h> using namespace std; #define inf 10000000 int p[20],can[20],d,dp[50000]; int getmax(int begin)//本金 { int i,j; memset(dp,0,sizeof(dp)); for(i=0;i<d;i++) //对每一种存款方式 进行完全背包操作 { for(j=p[i];j<=begin;j++) dp[j]=max(dp[j],dp[j-p[i]]+can[i]); } return dp[begin]; //返回最大的可得利息 } int main() { int t,mon,year,sum,i,j,leave,tmp; cin>>t; while(t--) { cin>>mon>>year>>d;// mon 一开始的本金, year 存的年数, d 存款方式种类数 leave=mon%1000; // leave 存的是本金里不能用的钱,也就是小于1000的部分 mon/=1000; tmp=mon; for(i=0;i<d;i++){ cin>>p[i]>>can[i]; p[i]/=1000; } //因为存款方式中The value of a bond is always a multiple of $1 000,所以除以1000,减少背包的容量 for(i=1;i<=year;i++) { sum=getmax(tmp);// sum 用来存改年可得利息 tmp=sum; mon=leave+mon*1000+tmp;// 更新本金 leave=mon%1000; //更新不能用的钱 mon/=1000; tmp=mon; //下一年的本金 } cout<<mon*1000+leave<<endl; } }