POJ 3181 Dollar Dayz
2015-08-28 19:01
211 查看
POJ 3181 Dollar Dayz
农夫约翰有N元钱,市场上有价值1……K的商品无限个,求所有的花钱方案?
刚开始的思路是:DP[i][j]=DP[i-1][j]+DP[i-1][j-i]+DP[i-1][j-2i]+DP[i-1][j-3i]+.......(后来发现优化递推式:DP[i][j]=DP[i-1][j]+DP[i][j-i])
可提交后发现不能AC,网上看了以后知道是大数问题。下面展示一大神代码。学习大数的表示:
农夫约翰有N元钱,市场上有价值1……K的商品无限个,求所有的花钱方案?
刚开始的思路是:DP[i][j]=DP[i-1][j]+DP[i-1][j-i]+DP[i-1][j-2i]+DP[i-1][j-3i]+.......(后来发现优化递推式:DP[i][j]=DP[i-1][j]+DP[i][j-i])
可提交后发现不能AC,网上看了以后知道是大数问题。下面展示一大神代码。学习大数的表示:
#include <iostream> using namespace std; // 0高位 1低位 unsigned long long dp[100 + 16][1000 + 16][2]; // dp[i][j] := 用i种价格配出金额j的方案数 #define LIMIT_ULL 10000000 int main() { int N, K; cin >> N >> K; for (int i = 1; i <= K; ++i) { dp[i][0][1] = 1; for (int j = 1; j <= N; ++j) { //由于优化后的递推式:dp[i][j] = dp[i – 1][j] + dp[i][j – i],所以要加上这个循环 if (j < i) { dp[i][j][0] = dp[i - 1][j][0]; dp[i][j][1] = dp[i - 1][j][1]; } else { dp[i][j][0] = dp[i - 1][j][0] + dp[i][j - i][0]; dp[i][j][1] = dp[i - 1][j][1] + dp[i][j - i][1]; // 高位进位 dp[i][j][0] += dp[i][j][1] / LIMIT_ULL; // 低位限制 dp[i][j][1] = dp[i][j][1] % LIMIT_ULL; } } } if (dp[K] [0]) { cout << dp[K] [0]; } cout << dp[K] [1] << endl; return 0; }
相关文章推荐
- Linux启动管理-启动过程/grub配置/Grub加密
- java多线程使用学习笔记
- POJ 题目3581 Sequence(后缀数组+离散化)
- xml使用
- 闭包 Closure
- 分享bitcraze的管理理念--Self organizing
- 九度OJ 题目1139:最大子矩阵
- Android GridView中设置了Button以后就不能响应OnItemClick()
- 判断[]是否是数组的两个方法
- 我的100个愿望
- Linux-2.6.32.67内核裁剪与移植之DM9000网卡驱动移植(3)
- maven 工程启动找不到 Spring ContextLoaderListener 的解决办法
- LeetCode-Single Number-解题报告
- collections接口用法
- OpenCv算法编程优化
- 最简MacOs10.8安装
- 远程桌面退出全屏/不能全屏/全屏切换的技巧
- 系统监控啊
- git创建分支
- 平衡二叉树