hdoj 1963(完全背包)

这是您的问题:给定一个开始的数量,几年的时间以及一组具有其价值和利益的债券,使用最佳的买卖债券时间表,找出在给定时期内该数量可能增长多少。

输入
第一行包含一个正整数N,它是测试用例的数量。测试用例如下。
测试用例的第一行包含两个正整数:以(最大为1 000 000 ),以及资本增长的年限(最多40年)。
下一行包含一个数字:可用债券的数字d(1 <= d <= 10)。
接下来的d行分别包含对键的描述。债券的描述由两个正整数组成:债券的价值和该债券的年利率。债券的价值始终是$ 1 000的倍数。债券的利息不得超过其价值的10%。
输出
对于每个测试用例,在最佳买卖计划之后,在单独的行中输出期末的资本。

Sample Input
1
10000 4
2
4000 400
3000 250
Sample Output
14050

#include 
#include 
#include  

using namespace std;

const int N = 1000010;

int t,n,m,d;
int v[N],w[N];//此题目中资金数量可视作背包容积  不同种债券利息可视作不同物品的物品价值
int f[N];

int main()
{
     	
	scanf("%d",&t);
	while(t--)
	{
     
		memset(v,0,sizeof(v));
    	memset(w,0,sizeof(w));
        memset(f,0,sizeof(f));
	scanf("%d%d",&n,&m);//n为资金数量 m为年数
	scanf("%d",&d); 
	for(int i=1;i<=d;i++) 
	{
     
		scanf("%d%d",&v[i],&w[i]);//输入数据
		v[i]/=1000; //总满足1000的倍数 故除以1000
	}
	
	for(int i=1;i<=m;i++){
     //代表m年投资
	memset(f,0,sizeof(f));//一年结束后清算 重新投资
	int maxn=n/1000;
	for(int i=1;i<=d;i++)//有d种债券
		for(int j=v[i];j<=maxn;j++)//钱数最多有(背包容积)maxn
			f[j]=max(f[j],f[j-v[i]]+w[i]);
			
			n+=f[maxn];//本金+利息 等于新的背包容积
	}
		printf("%d\n",n);
	}
 } 

你可能感兴趣的:(hdoj,动态规划,算法)