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

  [华为面试题] 1分2分5分的硬币三种,组合成1角,共有多少种组合

  [创新工厂笔试题] 有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,有多少中组合可以组成n分钱

  • 一个人上台阶可以一次上1个,2个,或者3个,问这个人上n层的台阶,总共有几种走法? 
    问法不一样,但是本质一样!

1.方法一

深度搜索解答树
#include<iostream>
#include<vector>
using namespace std;int coin[4] = { 1, 2, 5, 10 };
vector<int> solution;
int cnt = 0;
int sum = 0;int target = 0;void dfs(int index){if (sum == target){cnt++;for (int i = 0; i<solution.size(); i++){cout << solution[i];}cout << endl;return;}if (sum > target){return;}for (int i = index; i < 4; i++){// index,否则有重复sum += coin[i];solution.push_back(coin[i]);dfs(i);solution.pop_back();sum -= coin[i];}}int main(){cnt = 0;sum = 0;target = 5;dfs(0);cout << "cnt=" << cnt << endl;return 0;
}

结果为4

2.方法二-动态规划

给定一个数值sum,假设我们有m种不同类型的硬币{V1, V2, ..., Vm},如果要组合成sum,那么我们有

sum = x1 * V1 + x2 * V2 + ... + xm * Vm

求所有可能的组合数,就是求满足前面等值的系数{x1, x2, ..., xm}的所有可能个数。

dp[i][sum] = 用前i种硬币构成sum 的所有组合数。

  那么题目的问题实际上就是求dp[m][sum],即用前m种硬币(所有硬币)构成sum的所有组合数。

dp[i][sum] = dp[i-1][sum - 0*Vm] + dp[i-1][sum - 1*Vm]

+ dp[i-1][sum - 2*Vm] + ... + dp[i-1][sum - K*Vm]; 其中K = sum / Vm

那么初始情况是什么呢?如果sum=0,那么无论有前多少种来组合0,只有一种可能,就是各个系数都等于0;

dp[i][0] = 1   // i = 0, 1, 2, ... , m

我们规定为dp[0][sum] = 0.

#include<iostream>
#include<vector>
using namespace std;int coinCombination(int coin[], int coinKinds, int target){vector<vector<int> >dp(coinKinds + 1, vector<int>(target + 1));for (int i = 0; i <= coinKinds; i++){dp[i][0] = 1;}dp[0][target] = 0;for (int i = 1; i <= coinKinds; i++){for (int j = 1; j <= target; j++){dp[i][j] = 0;for (int k = 0; k <= j / coin[i - 1]; k++){//<=dp[i][j] += dp[i - 1][j - k*coin[i - 1]];//+=}}}return dp[coinKinds][target];
}int main(){int coin[4] = { 1, 2, 5, 10 };cout << coinCombination(coin, 4, 5) << endl;return 0;
}

http://www.cnblogs.com/python27/p/3303721.html

硬币面值组合(上台阶)相关推荐

  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. 动态规划之硬币面值组合问题

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

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

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

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

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

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

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

  8. 硬币面值组合的算法题解

    方法一 转自http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html 动态规划的方法,是将m*n(m表示硬币的种类,n表示所要组成 ...

  9. 7621:硬币面值组合

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

最新文章

  1. Sql Server函数全解(四)日期和时间函数
  2. debian 9系统安装配置iptables
  3. windows服务器连接linux nfs,windows设置通过NFS连接到Linux共享数据
  4. Java 授权内幕--转载
  5. 快速浏览JAX-RS请求与方法匹配
  6. Kubernetes学习笔记之kube-proxy service实现原理
  7. 今日早上出来还是阴天
  8. Centos7.X自带的防火墙和服务的相关的配置
  9. 按键精灵服务器推送消息,按键精灵手机助手基础练习:自动发送消息
  10. 【四足机器人--支撑相足端反作用力预测】(5)ConvexMPCLocomotion代码解析
  11. 区块链技术驱动商业银行开展供应链金融业务的创新路径
  12. html css img 居中显示图片,css图片垂直居中 让html img图片垂直居中的三种方法
  13. php主机卫士,Bypass360主机卫士SQL注入防御八种姿势
  14. PyTorch深度学习实践概论笔记8练习-kaggle的Titanic数据集预测(一)数据分析
  15. 第五章:量化研究专题(第四篇:统计套利:利用相关系数进行配对交易 )
  16. 如何用NLP辅助投资分析?三大海外机构落地案例详解
  17. 整合NGFW和威胁分析后,防火墙这是要上天?
  18. php如何实现验证码
  19. html div peidui,AirPods怎么删除配对过的设备 airpods可以和电脑连接的。
  20. 双非二本毕业生,惨遭滑铁卢,132天惨淡求职之路....

热门文章

  1. 关于sql server 2019的 卸载
  2. 【Bio】基础生物学 - 基因 gene
  3. 操作系统中文件系统-文件的分类
  4. poky: PACKAGECONFIG的用法
  5. JEECG 新手常见问题大全,入门必读
  6. 为什么要学Markdown?有什么用?
  7. %在c语言中起什么作用
  8. RPC 框架基本了解
  9. 《CLR via C#:框架设计》读书笔记 - 委托
  10. HTAP 应该是一种需求而不是一款产品