问题描述

目前市面上的纸币主要有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. 继承项目第13周-项目1-基类中成员的访问限定符和派生类的继承方式
  2. 阿里PB级Kubernetes日志平台建设实践
  3. AAAI 2021 | 从语义关系建模的角度进行句子语义关系匹配
  4. Spring安全示例教程
  5. drupal php filter,Drupal A-Z and number filter
  6. python3.6 配置COCO API出错解决方案
  7. [testNG]Cannot find class in classpath解决方法
  8. Emacs基本操作说明
  9. 软件设计原则和方法通俗理解
  10. springboot mybatis如何打印出查询语句_Java 面试,如何坐等 offer?
  11. 怎么用proteus软件仿真单片机程序?
  12. 常见问题-瑞友天翼应用虚拟化系统安装之前需要做什么准备
  13. 未来教育 · 软件破解
  14. 隐藏于世的网站内页seo优化技术
  15. μC/OS-II兼容层——让基于μC/OS-II开发的应用层无感地迁移到RT-Thread操作系统
  16. 基于OpenCV的图片电影换背景小实验(可用于证件照替换背景)_计算机视觉
  17. flutter手写画板,保存存成图片并上传到后台服务器
  18. math: 凸函数、拟凸函数和保凸运算
  19. hashmap是有序的吗_这里有675道Java面试题,你准备好接招了吗?(完整版)
  20. zuk如将手机更新到Android10,ZUI新升级:ZUK宣布支持全机型升级Android N系统

热门文章

  1. 如何在eclipse中添加dtd文件?
  2. 雷神之锤源码linux,雷神之锤3 的源代码查看
  3. 移动定位技术简述(转)
  4. pytorch安装保姆级教程及安装缓慢的解决方案(超时Timeout导致安装失败解决方案)
  5. HEC-HMS水文模型应用教程
  6. python基础之类方法和静态方法
  7. LINUX——grep命令用法
  8. 如何下载风云三号FY-3D MERSI数据
  9. access防下载表原理
  10. 推荐系统中的矩阵分解技术