POJ 2063 Investment 滚动数组+完全背包
2016-05-05 19:45
351 查看
题目链接:
http://poj.org/problem?id=2063题意:
你现在有现金m元,你要做n年的存款投资,给你k种投资方式,每种需要现金vi元,能获得xi元的理论,一年到期后你要利用拿到的本息和重新投资,问这样做n年最后能拿到的最大本息和是多少。题解:
dp[i]表示你花i元去投资能获得的最大利润。则第一年你要做的就是dp[1]->dp[m](m为初始金额) 假设获得的最大奖金为m_inte[i];
则第二年要做的是dp[m+1]->dp[m+m_inte[i]]
...
这样,完全背包一直做n年就可以了。
由于dp数组最多只能开到7*10^6(30000kb),所以这里用滚动数组的方式来节约空间,否则会爆空间限制。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1e6+10; const int mod = maxn; int n; int mny, ye; int valu[11], inte[11]; int dp[maxn]; void init() { memset(dp, -1, sizeof(dp)); } int main() { int tc; scanf("%d", &tc); while (tc--) { init(); scanf("%d%d", &mny, &ye); scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d%d", valu + i, inte + i); int idx = 1000; dp[0] = 0; int ans = 0; while (ye--) { for (; idx <= mny; idx += 1000) { dp[idx%mod] = -1; for (int i = 0; i < n; i++) { if (idx - valu[i] < 0) continue; if (dp[(idx - valu[i])%mod]!=-1) { dp[idx%mod] = max(dp[idx%mod], dp[(idx - valu[i])%mod] + inte[i]); ans = max(ans, dp[idx%mod]); } } } mny += ans; } printf("%d\n", mny); } return 0; }
相关文章推荐
- Android 友盟分享躺过的几个坑,大坑,坑爹
- 装饰模式
- 页面置换算法的访问位和修改位
- 文件下载的三种方式,看这里就已经足够了。
- Android 下的EXIF
- Swift快速入门视频
- solr入门之安全认证和权限控制实践
- nice--web前端
- QML学习文档_通宵测试完的 (转)
- 仿饿了吗配送时间效果
- 指针和引用的区别
- MySQL学习3:Windows 64位操作系统下验证MySQL
- js函数(类)的继承机制的设计与实现(三)
- Swift:网络库Alamofire
- Mybaties初步学习-入门
- vijos 1243 ——DP
- iOS ShareSDK QQ空间分享Error code=206
- 技术兴趣
- 快速排序
- iOS,一行代码进行RSA、DES 、AES、MD5加密、解密