poj2063 Investment
2015-10-31 17:42
357 查看
题目大意:给你一笔金额,你要将这比金额去投资,现在有t种股票,每种股票都有一个价值和年收益,问你如何投资在n年后的最大收益
并且股票的价值都是1000的倍数,所以后面优化,对每个价值除以1000
测试数据:
1 //有多少组测试数据
10000 4 //10000代表初始金额,4代表4年之后的最大收益
2 //有两种股票
4000 400 //接下来2行,每行分别代表每种股票的价值与年收益
3000 250
解决方案:完全背包问题,因为每种股票可以无限投资(前提是钱够),而问n年之后的最大收益,我们将每一年的最大收益计算,将前一年的本金+收益作为新的本金再次对第i年进行一次投资。
注意数组dp要开到1000*1.1^40,1000是1000000/1000,每年利息最多为0.1,最多40年,所以开到50000妥妥的,这里感谢一下kuangbin大牛的指点,因为这个我RE了不少次,也告诉我们,仔细读题。
并且股票的价值都是1000的倍数,所以后面优化,对每个价值除以1000
测试数据:
1 //有多少组测试数据
10000 4 //10000代表初始金额,4代表4年之后的最大收益
2 //有两种股票
4000 400 //接下来2行,每行分别代表每种股票的价值与年收益
3000 250
解决方案:完全背包问题,因为每种股票可以无限投资(前提是钱够),而问n年之后的最大收益,我们将每一年的最大收益计算,将前一年的本金+收益作为新的本金再次对第i年进行一次投资。
注意数组dp要开到1000*1.1^40,1000是1000000/1000,每年利息最多为0.1,最多40年,所以开到50000妥妥的,这里感谢一下kuangbin大牛的指点,因为这个我RE了不少次,也告诉我们,仔细读题。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; #define maxn 50000 int main() { int c[11],v[11]; int dp[maxn]; int n,m,year,k; int i,j,sum,x; scanf("%d",&n); while(n--) { scanf("%d%d",&m,&year); scanf("%d",&x); for(i=0;i<x;i++) { scanf("%d%d",&c[i],&v[i]); c[i]/=1000; } sum=0; for(i=0;i<year;i++) { memset(dp, 0, sizeof(dp)); sum=m/1000; for(j=0;j<x;j++) { for(k=0;k<=sum;k++) { if(k>=c[j]) dp[k]=max(dp[k],dp[k-c[j]]+v[j]); } } m+=dp[sum]; } printf("%d\n",m); } return 0; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- POJ 1200 Crazy Search(简单哈希)
- 【高手回避】poj3268,一道很水的dijkstra算法题
- POJ 1088 滑雪
- poj2387 Til the Cows Come Home—Dijkstra模板