凑钱问题
来源:互联网 发布:希特勒恶魔的崛起知乎 编辑:程序博客网 时间:2024/06/07 06:55
Q: 有足够量的2分、5分、1分硬币,请问凑齐1元钱有多少种方法?
我们从简单情况开始分析,假如有足够量的1分硬币,请问凑齐1分钱有多少种方法?毫无疑问,答案是1。然后,凑齐2分钱有多少种方法?凑齐n分钱有多少种方法?答案均是1。
接下来,假如有足够量的1分硬币和2分硬币,凑齐n分钱有多少种方法?对于1分硬币,凑齐任意n分钱都只有1种方法;那么只用1分钱凑齐n-2分钱,有1种方法;只用1分钱凑齐n-4分钱,有1种方法;只用1分钱凑齐n-6分钱,也有1种方法......
由此,用a1~ak种硬币,凑齐n分钱,记做S(k,n)。 可以得到递归公式S(k,n)=∑_S(k-1,n-m*ak) m=0~n/ak。
代码如下:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int maxcombine(vector<int> vec, int amount){ 6 int coin = 0; 7 int coin_number = 1; 8 int number = 0; 9 10 if (vec.size() > 1){ 11 coin = vec.back(); 12 vec.pop_back(); 13 } else { 14 ++number; 15 return number; 16 } 17 18 while(coin * coin_number < amount){ 19 number += maxcombine(vec, amount - coin_number*coin); 20 ++coin_number; 21 } 22 23 return number; 24 } 25 26 int main(){ 27 vector<int> vec; 28 int amount = 100; 29 int num = 0; 30 vec.push_back(1); // 1 is the first element of vector intentionally. 31 vec.push_back(2); 32 vec.push_back(5); 33 34 num = maxcombine(vec, amount); 35 cout << "the amount 100 combination count is " << num << endl; 36 37 return 0; 38 }
- 凑钱问题
- 凑钱
- 动态规划之最少硬币凑钱问题
- 贪心凑钱
- 美团上机编程之“”凑钱“”
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- 问题
- Smarty-缓存(单页面 多缓存)
- poj2421 Constructing Roads
- FLex 使用@Embed嵌入外部文件
- hdu1575 Tr A
- fnt 图字原理
- 凑钱问题
- 缓存
- 2012年10月29日 Back
- NSSetUncaughtExceptionHandler在iOS 5.0 模拟器上未被调用
- 字节排序函数与字节操纵函数
- 删除Linux分区
- 全国省市区三级联动js
- 如何从一个文件中删除另一个文件的重复项
- 如何查看经过iOS优化的PNG图片