方法一 转自http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html

动态规划的方法,是将m*n(m表示硬币的种类,n表示所要组成的和)的辅助数组,

个人认为这种方法的缺点是 较难理解,计算时间和辅助空间占用较多

方法二 参考http://blog.csdn.net/randyjiawenjie/article/details/6335208

这种方法是用递归的方式实现,个人觉得此方法在克服动态规划的缺陷上有较好的表现

下面是对两种算法的实现

#include <stdio.h>
#include <list>
#include <vector>
using namespace std;
list<int> myList;int count = 0;/*********************************
* numbers Combinations: using recursive algorithm
* Basic idea:
* 输入两个整数n和sum,从数列1,2,3,……n中随意取几个数,使其和等于sum。
* 要求将所有的可能组合列出来
**********************************/
void findSum(int sum,int n)
{if(n<1 || sum <1){return ;}if(sum > n){myList.push_back(n);findSum(sum-n,n-1);myList.pop_back();findSum(sum,n-1);}else if(sum == n){count++;list<int>::iterator it = myList.begin();while(it != myList.end()){printf(" %d",*it++);}printf(" %d",n);printf(" count = %d\n",count);}else{}
}
void findRecursive(int sum,int n[],int index)
{if(index < 0 ){return ;}if(sum >= n[index]){for(int i=1;i<= sum/n[index];i++){//printf(" sum=%d,i*n[index]=%d \n",sum,i*n[index]);myList.push_back(i);myList.push_back('*');myList.push_back(n[index]);if(sum-i*n[index] == 0){count++;list<int>::iterator it = myList.begin();while(it != myList.end()){if(*it != 42)printf(" %d",*it);elseprintf("*");it++;}              printf(" count = %d\n",count);}findRecursive(sum-i*n[index],n,index-1);myList.pop_back();myList.pop_back();myList.pop_back();}findRecursive(sum,n,index-1);}else if(sum == n[index]){count++;list<int>::iterator it = myList.begin();while(it != myList.end()){if(*it != 42)printf(" %d",*it);elseprintf("*");it++;}if(sum != 0)printf(" %d",n[index]);printf(" count = %d\n",count);}else{}
}
/***************************************************************** coin Combinations: using dynamic programming** Basic idea:* dp[i][j] = sum(dp[i-1][j-k*coins[i-1]]) for k = 1,2,..., j/coins[i-1]* dp[0][j] = 1 for j = 0, 1, 2, ..., sum* * Input:* coins[] - array store all values of the coins* coinKinds - how many kinds of coins there are* sum - the number you want to construct using coins** Output:* the number of combinations using coins construct sum** Usage:* c[3] = {1, 2, 5};* int result = coinCombinations(c, 3, 10);*****************************************************************/
int findDP(int sum,int coins[], int coinKinds)
{// 2-D array using vector: is equal to: dp[coinKinds+1][sum+1] = {0};vector<vector<int> > dp(coinKinds+1);int i=0;for(i=0;i<=coinKinds;i++){dp[i].resize(sum+1);}for(i = 0; i<=coinKinds;i++){for(int j=0;j<=sum;j++){dp[i][j] = 0;}}//init: dp[i][0] = 1; i = 0, 1, 2 ..., coinKinds//Notice: dp[0][0] must be 1, althongh it make no sense that//using 0 kinds of coins construct 0 has one way. but it the foundation//of iteration. without it everything based on it goes wrongfor(i=0;i<=coinKinds;i++){dp[i][0] = 1;}//iteration: dp[i][j]= sum(dp[i-1][j-k*coins[i-1])//k = 0,1,2,3,...,j/coins[i-1]for (i = 1; i <= coinKinds; ++i){for (int j = 1; j <= sum; ++j){dp[i][j] = 0;for (int k = 0; k <= j / coins[i-1]; ++k){dp[i][j] += dp[i-1][j - k * coins[i-1]];}}}return dp[coinKinds][sum];
}
int main()
{int m,n;int i,j;int a[]={5,2,1};m = 20,n=9;//   findSum(10,n);findRecursive(10,a,2);
//  count = findDP(10,a,3);printf("find %d times\n",count);return 0;
}

硬币面值组合的算法题解相关推荐

  1. OpenJudge NOI 2.1 7621:硬币面值组合

    [题目链接] OpenJudge NOI 2.1 7621:硬币面值组合 [题目考点] 1. 枚举 2. 输出数字,0占位 在m个字符位置中输出数字n,右对齐,其余部分由0占位: printf(&qu ...

  2. 硬币面值组合(C++)

    硬币面值组合 总时间限制: 1000ms 内存限制: 65536kB 描述 使用1角.2角.5角硬币组成 n 角钱. 设1角.2角.5角的硬币各用了a.b.c个,列出所有可能的a, b, c组合. 输 ...

  3. 硬币兑换python 每个面值有多个_【算法27】硬币面值组合问题

    问题描述 假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n.例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 ...

  4. python硬币面值组合_【算法27】硬币面值组合问题

    问题描述 假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n.例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 ...

  5. 7621:硬币面值组合

    描述 使用1角.2角.5角硬币组成 n 角钱. 设1角.2角.5角的硬币各用了a.b.c个,列出所有可能的a, b, c组合. 输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大. 输入 一个 ...

  6. 硬币面值组合(C++)(枚举)

    总时间限制: 1000ms 内存限制: 65536kB  描述  使用1角.2角.5角硬币组成 n 角钱.  设1角.2角.5角的硬币各用了a.b.c个,列出所有可能的a, b, c组合.  输出顺序 ...

  7. 动态规划之硬币面值组合问题

    原文链接:http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html 问题描述 假设我们有8种不同面值的硬币{1,2,5,10,20 ...

  8. 硬币面值组合问题(完全背包问题)

    参考:http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html i表示只用前i种硬币,sum表示要组合出的面值 下图是当有面值为1 ...

  9. 硬币面值组合(上台阶)

    假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n.问总过有多少种可能的组合方式? 类似的题目还有: [华为面试题] 1分2分5分的硬币三 ...

最新文章

  1. Kotlin 1.2引入多平台项目特性
  2. linux 内核 netfilter 网络过滤模块 (1)-框架
  3. log4j linux如果日志目录不存在,Java日志库学习笔记
  4. matlab基本杆组-运动学仿真,MATLAB基本杆组-运动学仿真.pdf
  5. Linux学习笔记之三
  6. 基于RBAC模型的通用企业权限管理系统
  7. Live Maps中国更新-为北京增加实时交通信息
  8. android手势感应预研
  9. linux命令编写,Linux alias命令编写
  10. EAST算法超详细源码解析:数据预处理与标签生成
  11. (54)FPGA条件选择有优先级(if-else)
  12. 当科学家遇上流氓,被喧哗炒作的量子通信技术又将何时落地?
  13. 免ajax省市三级联动:http://runjs.cn/detail/rcsqficf
  14. 打印机语言PCL与PostScript的比较
  15. imshow显示图像为纯白或者纯黑或者为杂点(noise)原因分析(下篇)
  16. appinventor计算机教程,App Inventor编程开发集锦2-计算器-第2课-实现常规操作
  17. 测量电源纹波-正确测量方法
  18. 中国成语测试软件,中国汉字水平测试
  19. 优化elelment ui 的 dialog 样式
  20. COUNTIF函数:

热门文章

  1. python两个等于号是代表什么_python两个等于号是什么意思_等于号表示什么意思...
  2. 谷歌地图-Google Map
  3. 论文投稿指南——中文核心期刊推荐(植物保护)
  4. python 爬取腾讯视频弹幕
  5. 软件企业认定的标准要求
  6. Android Snackbar控件
  7. win怎么查看显示器大小,显示器是多少寸,查看显示器尺寸
  8. 使iis支持php的方法简介
  9. 设计模式的七大原则之单一职责原则
  10. Doc和Docx有什么区别