HDU 1284 钱币兑换问题(递归)
2016-02-21 15:55
232 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1284
代码:
分析:
第一种是通过递归实现:
今天刚从《妙趣横生的算法》看到整数的划分数的递归算法。
以下是归纳出来的递归函数式:
设标记P(n, m)表示正整数n的所有不同划分中,最大加数不大于m的划分个数。
[ 1 m = 1;
P(n, m) = [ P(n, n) n < m;
[ 1 + P(n, n-1) n = m;
[ P(n, m-1) + P(n-m, m) n > m > 1.
由于本题已经对m作出限制(m ≤3),所以要对上诉递归函数式作些修改
P(n, m) = 1 + P(n, n-1) n = m; 修改为 P(n, m) = m n = m; 因为m = 1,只有一种方案;m = 2, 2种;m = 3,3种。
代码:
#define MaxSize 32768 int cnt[MaxSize][4]; int partition(int n, int m) { if (cnt [m] > 0) { return cnt [m]; } if (1 > m || 1 > n) { return 0; } if (1 == m || 1 == n) { return 1; } if (n < m) { return partition(n, n); } if (n == m) { return m; } return cnt [m] = partition(n, m - 1) + partition(n - m, m); } int main() { int num; while (EOF != scanf("%d", &num)) { printf("%d\n", partition(num, 3)); } return 0; }
分析:
第一种是通过递归实现:
今天刚从《妙趣横生的算法》看到整数的划分数的递归算法。
以下是归纳出来的递归函数式:
设标记P(n, m)表示正整数n的所有不同划分中,最大加数不大于m的划分个数。
[ 1 m = 1;
P(n, m) = [ P(n, n) n < m;
[ 1 + P(n, n-1) n = m;
[ P(n, m-1) + P(n-m, m) n > m > 1.
由于本题已经对m作出限制(m ≤3),所以要对上诉递归函数式作些修改
P(n, m) = 1 + P(n, n-1) n = m; 修改为 P(n, m) = m n = m; 因为m = 1,只有一种方案;m = 2, 2种;m = 3,3种。
相关文章推荐
- 重温世界杯(贪心)
- 写一个操作系统视屏
- Android之解决太大太多图片造成的oom
- ModeDriven 和Preparable拦截器 及其源码解析
- 【C#之Try……Catch实例】
- 2sum问题和3sum问题
- 备忘
- MediaPlayer初探一
- ucos实时操作系统学习笔记——任务间通信(消息)
- 【BZOJ 1189】[HNOI2007]紧急疏散evacuate
- 【Linux 开发篇】之 计划任务
- 利用Qt制作一个helloworld
- WinCE 系统下移动存贮设备Storage 的拔插检测
- Android质量压缩和尺寸压缩
- 24点javascript自动计算
- 04环信聊天界面 - 发送图片消息和显示图片
- opencv图像识别技术在自动化测试中的应用
- 内核的角色
- WinCE Stack 异常
- 和我一起学《HTTP权威指南》——客户端识别与cookie机制