您的位置:首页 > 其它

POJ NO.2063 Investment(完全背包,典例)

2016-03-05 09:54 561 查看
问题描述:

给你一笔金额,你要将这比金额去投资,现在有t种股票,每种股票都有一个价值和年收益,问你如何投资在n年后的最大收益。

每一年投资后都要以利润连同本金继续投资下一年。

测试数据:

1 //有多少组测试数据

10000 4 //10000代表初始金额,4代表4年之后的最大收益

2 //有两种股票

4000 400 //接下来2行,每行分别代表每种股票的价值与年收益

3000 250

题目链接:POJ NO.2063

思路:

代码里已经注释的很清楚了,要注意股票的价格都是1000的倍数,所以把股票的价格都除以1000来做优化。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
#include<vector>
#include<set>
using namespace std;

#define X first
#define Y second
#define PI 3.1415926

const int INF = 0x3f3f3f3f;
const int MAX = 100000;
int dp[MAX];

int main(){
int t;
scanf("%d", &t);
while(t--){
int mon, y, n;
scanf("%d%d%d", &mon, &y, &n);
int a
, b
;
for(int i = 0; i < n; i++){
scanf("%d%d", &a[i], &b[i]);
a[i] /= 1000;//因为股票的价格都是1000的倍数所以都除以1000,以做优化
}
int money;
for(int i = 0; i < y; i++){//一共有y年,所以要循环y次
money = mon / 1000;
memset(dp, 0, sizeof(dp));
//完全背包
for(int j = 0; j < n; j++){
for(int k = a[j]; k <= money; k++){
dp[k] = max(dp[k], dp[k-a[j]] + b[j]);
}
}
//把每一年的收益连同本金继续下一年的投资
mon += dp[money];
}
printf("%d\n", mon);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: