完全背包——POJ 2063

POJ 2063 Investment

/*
POJ 2063
典型的多重背包问题
每种债券的价格是重量,每年的利息是价值
这道题目多了个增长的年数,所以每一年得到利息+本金后,就要重新进行一次债券的购买选择
*/

#include <iostream>
using namespace std;

int values[15]; //债券价格
int interest[15];  //年利息
int dp[999999];

int main()
{
	int nCase,growthYears,baseMoney,boundKinds;
	int i,j,v,now_money;

	cin>>nCase;
	while(nCase--)
	{
		cin>>baseMoney>>growthYears;
		cin>>boundKinds;
		for(i=1;i<=boundKinds;i++)
		{
			cin>>values[i]>>interest[i];
			values[i] /= 1000; //是1000的倍数,除以1000,使得开的数组可以小很多
		}
		while(growthYears--)
		{
			now_money = baseMoney/1000;
			
			for(i=0;i<999999;i++)
				dp[i]=0;
		
			for(j=1;j<=boundKinds;j++)
				for(v=values[j];v<=now_money;v++)
					if(dp[v-values[j]]+interest[j] > dp[v])
						dp[v] = dp[v-values[j]] + interest[j];
		
			baseMoney += dp[now_money];
		}
		cout<<baseMoney<<endl;
	}
	return 0;
}


你可能感兴趣的:(完全背包——POJ 2063)