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来做优化。
代码:
给你一笔金额,你要将这比金额去投资,现在有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; }
相关文章推荐
- MySQL中concat函数(连接字符串)学习整理
- 最大子序列和——简单问题的不简单之处
- Error:uafxcwd.lib的处理
- BackgroundSubtractorMOG部分代码
- HBase Java API
- 物料批次特性值
- android日期相关知识
- CE 6.0 R2对CE 6.0的功能增加
- 天声人語 20160305 聖火台の置き場がない!
- String初始化问题
- POX启动过程分析
- PAT1038统计同成绩学生
- UIKit性能调优实战讲解
- VS2005 学习记录3-移植处理
- 决心书
- C++智能指针作为成员变量的用法
- iOS 高效添加圆角效果实战讲解
- 线性理解原型对象
- Instuments
- 操作系统是如何工作的