暑假- 动态规划 I-(S - Investment)

/*
题意:给出初始资金[初始背包容量]和年数[N],d种证卷:价钱[占背包的大小]和一年的利润。
求N年后,能获得的最大金钱数。
思路:完全背包题目,因为每种证券的价值都是1000的倍数,所以证券的价前和当前总资金数都除以
1000来计算。
*/
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100005;
int dp[maxn];//dp[i]表示容量为i的背包一年能获得的最大利润。
int mymax(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int amount,year,d;
		int a[11][2];
		cin>>amount>>year;
		cin>>d;
		for(int i=1;i<=d;i++)
		{
			cin>>a[i][0];//价钱
			cin>>a[i][1];//利润
		}
		for(int i=1;i<=year;i++)//循环年数
		{
			memset(dp,0,sizeof(dp));//每次将背包清空
			for(int j=1;j<=d;j++)//循环各种证券
			{
				for(int k=(a[j][0]/1000);k<=amount/1000;k++)//将背包除以1000后,在用完全背包求解
				{
					dp[k]=mymax(dp[k],dp[k-a[j][0]/1000]+a[j][1]);
				}
			}
			amount+=dp[amount/1000];//当年的总资金=当年的初始资金+当年所获得的利润。
		}
		cout<<amount<<endl;
	}
	return 0;
}
			

你可能感兴趣的:(dp)