1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题
问题描述
目前市面上的纸币主要有1元,5元,10元,20元,50元、100元六种,如果要买一件商品x元,有多少种货币组成方式?
解答
我们先进行如下变量的定义:
dp[i][sum] = 用前 i 种硬币构成sum金额的所有组合数。
那么题目的问题实际上就是求dp[m][sum],即用前m种硬币(所有硬币)构成sum的所有组合数。
V0=1,V1=5,V2=10,V3=20……
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
换一种更抽象的数学描述就是:
我们可以这么考虑,希望用m
种纸币构成sum
元。
如果sum=0,那么无论有前多少种来组合0,只有一种可能,就是各个系数都等于0;
dp[i][0] = 1 // i = 0, 1, 2, … , m
如果我们用二位数组表示dp[i][sum], 我们发现第i行的值全部依赖与i-1行的值,所以我们可以逐行求解该数组。如果前0种纸币要组成sum,我们规定为dp[0][sum] = 0.
dp[j] 代表:之前 0 到 i-1 种货币组合成 j 元的种类数。
dp[j-money[i]] 代表:从 j 元中抽出一张 money[i] 的货币(即加入了money[i]这种货币),剩下组合成 j-money[i] 元的种类数。
由于dp[j]在不停地被替换,所以不用担心 dp[i-1][sum - 2*Vm] 这种,在算 dp[j-money[i]] 的时候,那个时候这里面的种类数已经是最新最全的 包含了货币money[i]的了。
代码实现方式
public class Test {/*** @param x 商品金额*/public static void test(int n){//纸币面额int money[]={1,5,10,20,50,100};int dp[] = new int[n+1];dp[0] = 1;for(int i = 0;i < 6;++i){for(int j = money[i];j <= n;++j){dp[j] =(dp[j]+dp[j-money[i]]);}}System.out.println(dp[n]);}public static void main(String[] args) { //指定100元的金额test(100); }
}
分析
这种思路属于算法中的动态规划。也是动态规划的经典题目。很明显,大大优化了性能问题。
1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题相关推荐
- 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题
最近有一道笔试题引起了小伙伴们的激烈讨论. 参考博客 作为算法菜鸟非常感谢大神的分析和举例.博客地址 问题描述 目前市面上的纸币主要有1元,5元,10元,20元,50元.100元六种,如果要买一件商品 ...
- 用1元,2元,5元,10元,20元和50元的纸币组成100元,共有多少种情况
static void Main(string[] args) { int count = 0; //1元组成的情况,最多有100种 ...
- 黑马程序员,黑马论坛------'Android25期,毕业46天,100%全部就业,平均薪水8210元!
来源:黑马程序员,黑马论坛 Android25期,毕业46天,100%全部就业,平均薪水8210元! 班级名称:黑马android25期 毕业时间:2月24日 总人数:70人 班 歌:< ...
- 黑马程序员,黑马论坛------Android24期,毕业143天,100%全部就业,平均薪水8415元!
来源:黑马程序员,黑马论坛 Android24期,毕业143天,100%全部就业,平均薪水8415元! 班级名称:黑马Android24期 毕业时间:1月22日 总人数:74人 班 歌:&l ...
- 互联网晚报 | 10月20日 星期三 | 小米汽车预计2024年量产;阿里发布自研CPU芯片倚天710;《长津湖》票房破50亿元...
今日看点 ✦ 雷军:造车进展远超预期,小米汽车预计2024年上半年正式量产 ✦ 字节跳动回应"商业化团队撤城裁员":裁员属实,正常业务调整 ✦ 阿里平头哥发布自研CPU芯片倚天71 ...
- 20180925_Python练习题-三:一个商场在降价促销。如果购买金额50~100元(包含50元和100元)之间,会给10%的折扣;如果购买金额大于100元,会給20%折扣。编写一程序,询问购买价
# 一个商场在降价促销.如果购买金额50~100元(包含50元和100元)之间,会给10%的折扣:如果购买金额大于100元,会給20%折扣.编写一程序,询问购买价 # 格,再显示出折扣(10%或20% ...
- 给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。
给定四种水果,分别是苹果(apple).梨(pear).桔子(orange).葡萄(grape),单价分别对应为3.00元/公斤.2.50元/公斤.4.10元/公斤.10.20元/公斤. 首先在屏幕上 ...
- 有 20 枚硬币,可能包括 4 种类型:1 元、5 角、1 角和 5 分。已知 20 枚硬币的总价值为 10 元,求各种硬币的数量。
有以下问题 有 20 枚硬币,可能包括 4 种类型:1 元.5 角.1 角和 5 分.已知 20 枚硬币的总价值为 10 元,求各种硬币的数量. 首先我们先来分析一下,每种硬币的情况,1 元最多 10 ...
- /*编程实现邮局寄包裹的邮费计算:用户输入包裹的重量,按如下规定计算邮费。 * 邮局对包裹邮费规定如下:重量(千克)不超过10,收费标准为0.80元/千克; * 不超过20,收费标准为0.75元/
/*编程实现邮局寄包裹的邮费计算:用户输入包裹的重量,按如下规定计算邮费. * 邮局对包裹邮费规定如下:重量(千克)不超过10,收费标准为0.80元/千克: * 不超过20,收费标准为0.75元/ ...
最新文章
- 专属程序员的编程日历,终于来了 | 10月书讯
- 计算机乘除法运算中部分积和余数的符号位选择与位移的关系
- Android中数据库的一些操作(增删改查)
- 保存工具条菜单有bug吗?
- ho1365_共享力量的四种方法,而不是ho积
- android 性能优化---(5)Bitmap图片资源优化
- SAP License:SAP问题二则
- c语言代码re通常什么错误,C语言,realloc动态内存申请,出现报错double free or corruption (!prev)...
- java object 数组_Java用Object实现数组队列的泛思与理解
- App性能测试以及测试方法技巧
- c语言从入门到放弃之冒泡排序
- 什么是Web应用程序防火墙?
- COSO流动性协议和跨链协议,能否解决流动性难题?
- 面试官:这波HTTP究极combo,你顶得住吗?
- python ABCD 选项蒙题游戏
- 应试教育与理想教育之间
- 计算机毕业设计Java高校多媒体设备报修管理系统(源码+系统+mysql数据库+lw文档)
- Zotero 中英文文献通用快捷引用方法
- 校赛 问题 F: 传送门(Dijkstra算法)
- 2012年中国管理咨询公司排名(前100位)