硬币面值组合(上台阶)
假设我们有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
硬币面值组合(上台阶)相关推荐
- OpenJudge NOI 2.1 7621:硬币面值组合
[题目链接] OpenJudge NOI 2.1 7621:硬币面值组合 [题目考点] 1. 枚举 2. 输出数字,0占位 在m个字符位置中输出数字n,右对齐,其余部分由0占位: printf(&qu ...
- 硬币面值组合(C++)
硬币面值组合 总时间限制: 1000ms 内存限制: 65536kB 描述 使用1角.2角.5角硬币组成 n 角钱. 设1角.2角.5角的硬币各用了a.b.c个,列出所有可能的a, b, c组合. 输 ...
- 硬币兑换python 每个面值有多个_【算法27】硬币面值组合问题
问题描述 假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n.例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 ...
- 动态规划之硬币面值组合问题
原文链接:http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html 问题描述 假设我们有8种不同面值的硬币{1,2,5,10,20 ...
- 硬币面值组合问题(完全背包问题)
参考:http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html i表示只用前i种硬币,sum表示要组合出的面值 下图是当有面值为1 ...
- python硬币面值组合_【算法27】硬币面值组合问题
问题描述 假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n.例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 ...
- 硬币面值组合(C++)(枚举)
总时间限制: 1000ms 内存限制: 65536kB 描述 使用1角.2角.5角硬币组成 n 角钱. 设1角.2角.5角的硬币各用了a.b.c个,列出所有可能的a, b, c组合. 输出顺序 ...
- 硬币面值组合的算法题解
方法一 转自http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html 动态规划的方法,是将m*n(m表示硬币的种类,n表示所要组成 ...
- 7621:硬币面值组合
描述 使用1角.2角.5角硬币组成 n 角钱. 设1角.2角.5角的硬币各用了a.b.c个,列出所有可能的a, b, c组合. 输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大. 输入 一个 ...
最新文章
- Sql Server函数全解(四)日期和时间函数
- debian 9系统安装配置iptables
- windows服务器连接linux nfs,windows设置通过NFS连接到Linux共享数据
- Java 授权内幕--转载
- 快速浏览JAX-RS请求与方法匹配
- Kubernetes学习笔记之kube-proxy service实现原理
- 今日早上出来还是阴天
- Centos7.X自带的防火墙和服务的相关的配置
- 按键精灵服务器推送消息,按键精灵手机助手基础练习:自动发送消息
- 【四足机器人--支撑相足端反作用力预测】(5)ConvexMPCLocomotion代码解析
- 区块链技术驱动商业银行开展供应链金融业务的创新路径
- html css img 居中显示图片,css图片垂直居中 让html img图片垂直居中的三种方法
- php主机卫士,Bypass360主机卫士SQL注入防御八种姿势
- PyTorch深度学习实践概论笔记8练习-kaggle的Titanic数据集预测(一)数据分析
- 第五章:量化研究专题(第四篇:统计套利:利用相关系数进行配对交易 )
- 如何用NLP辅助投资分析?三大海外机构落地案例详解
- 整合NGFW和威胁分析后,防火墙这是要上天?
- php如何实现验证码
- html div peidui,AirPods怎么删除配对过的设备 airpods可以和电脑连接的。
- 双非二本毕业生,惨遭滑铁卢,132天惨淡求职之路....