问题描述

目前市面上的纸币主要有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. 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题

    最近有一道笔试题引起了小伙伴们的激烈讨论. 参考博客 作为算法菜鸟非常感谢大神的分析和举例.博客地址 问题描述 目前市面上的纸币主要有1元,5元,10元,20元,50元.100元六种,如果要买一件商品 ...

  2. 用1元,2元,5元,10元,20元和50元的纸币组成100元,共有多少种情况

    static void Main(string[] args)         {             int count = 0;             //1元组成的情况,最多有100种   ...

  3. 黑马程序员,黑马论坛------'Android25期,毕业46天,100%全部就业,平均薪水8210元!

    来源:黑马程序员,黑马论坛 Android25期,毕业46天,100%全部就业,平均薪水8210元! 班级名称:黑马android25期 毕业时间:2月24日 总人数:70人 班      歌:< ...

  4. 黑马程序员,黑马论坛------Android24期,毕业143天,100%全部就业,平均薪水8415元!

    来源:黑马程序员,黑马论坛 Android24期,毕业143天,100%全部就业,平均薪水8415元! 班级名称:黑马Android24期 毕业时间:1月22日 总人数:74人 班      歌:&l ...

  5. 互联网晚报 | 10月20日 星期三 | 小米汽车预计2024年量产;阿里发布自研CPU芯片倚天710;《长津湖》票房破50亿元...

    今日看点 ✦ 雷军:造车进展远超预期,小米汽车预计2024年上半年正式量产 ✦ 字节跳动回应"商业化团队撤城裁员":裁员属实,正常业务调整 ✦ 阿里平头哥发布自研CPU芯片倚天71 ...

  6. 20180925_Python练习题-三:一个商场在降价促销。如果购买金额50~100元(包含50元和100元)之间,会给10%的折扣;如果购买金额大于100元,会給20%折扣。编写一程序,询问购买价

    # 一个商场在降价促销.如果购买金额50~100元(包含50元和100元)之间,会给10%的折扣:如果购买金额大于100元,会給20%折扣.编写一程序,询问购买价 # 格,再显示出折扣(10%或20% ...

  7. 给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

    给定四种水果,分别是苹果(apple).梨(pear).桔子(orange).葡萄(grape),单价分别对应为3.00元/公斤.2.50元/公斤.4.10元/公斤.10.20元/公斤. 首先在屏幕上 ...

  8. 有 20 枚硬币,可能包括 4 种类型:1 元、5 角、1 角和 5 分。已知 20 枚硬币的总价值为 10 元,求各种硬币的数量。

    有以下问题 有 20 枚硬币,可能包括 4 种类型:1 元.5 角.1 角和 5 分.已知 20 枚硬币的总价值为 10 元,求各种硬币的数量. 首先我们先来分析一下,每种硬币的情况,1 元最多 10 ...

  9. /*编程实现邮局寄包裹的邮费计算:用户输入包裹的重量,按如下规定计算邮费。 * 邮局对包裹邮费规定如下:重量(千克)不超过10,收费标准为0.80元/千克; * 不超过20,收费标准为0.75元/

    /*编程实现邮局寄包裹的邮费计算:用户输入包裹的重量,按如下规定计算邮费.  * 邮局对包裹邮费规定如下:重量(千克)不超过10,收费标准为0.80元/千克:  * 不超过20,收费标准为0.75元/ ...

最新文章

  1. 专属程序员的编程日历,终于来了 | 10月书讯
  2. 计算机乘除法运算中部分积和余数的符号位选择与位移的关系
  3. Android中数据库的一些操作(增删改查)
  4. 保存工具条菜单有bug吗?
  5. ho1365_共享力量的四种方法,而不是ho积
  6. android 性能优化---(5)Bitmap图片资源优化
  7. SAP License:SAP问题二则
  8. c语言代码re通常什么错误,C语言,realloc动态内存申请,出现报错double free or corruption (!prev)...
  9. java object 数组_Java用Object实现数组队列的泛思与理解
  10. App性能测试以及测试方法技巧
  11. c语言从入门到放弃之冒泡排序
  12. 什么是Web应用程序防火墙?
  13. COSO流动性协议和跨链协议,能否解决流动性难题?
  14. 面试官:这波HTTP究极combo,你顶得住吗?
  15. python ABCD 选项蒙题游戏
  16. 应试教育与理想教育之间
  17. 计算机毕业设计Java高校多媒体设备报修管理系统(源码+系统+mysql数据库+lw文档)
  18. Zotero 中英文文献通用快捷引用方法
  19. 校赛 问题 F: 传送门(Dijkstra算法)
  20. 2012年中国管理咨询公司排名(前100位)

热门文章

  1. 2022-2028全球与中国长刃泳鳍市场现状及未来发展趋势
  2. 通过图新地球将GPS信息写入照片
  3. 网站被攻击了怎么办?3种网站攻击的解决办法
  4. maven:mirror和repository
  5. 抓取猫眼电影排行-基于Beautiful Soup
  6. 2021年低压电工考试题及低压电工模拟试题
  7. Arduino Rx、Tx硬串口通信Serial屡败屡战记录-将数值重新转换成字符串-重复多次读怎么办??
  8. Flash P2P 语音视频聊天示例
  9. centos minimal mysql_安装centos minimal 版本后安装mysql详细过程(linux)
  10. 高中英语教师个人研修计划