动态规划之硬币表示问题
转载:http://m.blog.csdn.net/cy13299138237/article/details/50474271
问题描述:有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。
求解思路:这也是典型的动态规划问题,我们可以这样考虑:当只有1分的硬币时,n从1到n分别有多少种表示方法;当有1分和5分的硬币时,n从1到n分别有多少种表示方法,因此类推,直到我们将1分、5分、10分和25分的硬币全部使用完。。我们用数组coins[i]={1,5,10,25}表示各种币值,此时可以维护一张二维表ways[i][j],其中横坐标表示前i种表示币值,j表示硬币的总值,则ways[i][j]表示能用前i种硬币来表示j分的方法数。
当增加一种新的硬币币值时,有两种情况:
(1)不加入此种币值:ways[i][j]=ways[i-1][j];
(2)加入此种币值:加入该枚硬币之前的方法数为ways[i][j-coins[i]],那么加入该枚硬币之后构成j分的方法数也为ways[i][j-coins[i]]。
因此当增加一种新的币值时,j分的表示方法数为ways[i][j]=ways[i-1][j]+ways[i][j-coins[i]]。
代码实现:
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] coins = {1, 5, 10, 25};int[][] ways = new int[4][n + 1];for (int i = 0; i < 4; i++)ways[i][0] = 1; //第0行初始化为1for (int j = 1; j <= n; j++)ways[0][j] = 1; //第0列初始化为1for (int i = 1; i < 4; i++) {for (int j = 1; j <= n; j++) {if (j >= coins[i])ways[i][j] = ways[i - 1][j] + ways[i][j - coins[i]];elseways[i][j] = ways[i - 1][j];}}System.out.println(ways[3][n]);}
当然,维护二维表未免过于复杂,我们可以维护一张一维表,即用一维数组ways[j]来记录j分的表示方法数。改进的代码实现如下:
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();int []coins={1,5,10,25};int []ways=new int[n+1];ways[0]=1;for(int i=0;i<4;i++){for(int j=coins[i];j<=n;j++){ways[j]=ways[j]+ways[j-coins[i]];}}System.out.println(ways[n]);}
}
动态规划之硬币表示问题相关推荐
- java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现
硬币找零问题是动态规划的一个经典问题,其中最少硬币找零是一个变种,本篇将参照上一篇01背包问题的解题思路,来详细讲解一下最少硬币找零问题.如果你需要查看上一篇,可以点击下面链接: 详解动态规划01背包 ...
- 硬币组合问题python_动态规划之硬币组合问题
问题:如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? 动态规划的本质是将原问题分解为同性质的若干相同子结构,在求解最优值的过程中将子结构的最优值记录到一个表中以避免有时会有 ...
- java硬币兑换_java动态规划取硬币问题
最近一直在研究动态规划的问题.今天遇到了取硬币问题. 其实动态规划还是,我从底部向顶部,依次求出每个状态的最小值,然后就可以标记上. 这道题目就是,假如有1,5,7,10这四种币值的硬币,我取14元, ...
- 动态规划---最小硬币数(Python)
目录 一.具体题目 二.思路 三.扩展 一.具体题目 有3种硬币,面值分别为2元.5元.7元,每种硬币数量都无穷多.求拼成27元的最少硬币数. 二.思路 这个题目乍一看可能很多人认为要用贪心策略,就是 ...
- 动态规划实战--硬币找零问题
上一篇文章上提到硬币找零的例子,现在我们实战动态规划就从硬币找零开始 问题描述: 给定 n 种不同面值的硬币,分别记为 c[0], c[1], c[2], - c[n],同时还有一个总金额 k,编写一 ...
- 动态规划之硬币组合问题
问题:如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? 动态规划的本质是将原问题分解为同性质的若干相同子结构,在求解最优值的过程中将子结构的最优值记录到一个表中以避免有时会有 ...
- 最值动态规划——最少硬币组合
#include<iostream> #include<cstdio> #include<cstring> //本来想用 memset 函数来着,后来除了岔子!除了 ...
- 动态规划解决硬币找零问题
题目描述:给定不同面额的硬币 coins 和一个需要找零的金额 n.编写一个函数来计算可以凑成金额n所需的最少的硬币个数.并求出所需硬币的所有面额并输出.(硬币可重复多次使用) 动态规划算法通常用于求 ...
- 【动态规划】硬币问题
整理的算法模板合集: ACM模板 问题描述 有n种硬币,面值分别为V1,V2,V3,.....VnV _1,V_2,V_3,.....V_nV1,V2,V3,.....Vn,每种都有无限多. ...
最新文章
- Python常用内置函数(二)
- RandLA-Net测试
- ST_Curve --- 一个专业的曲线绘制控件
- 在C ++应用程序中使用Designer UI文件
- 有关linux下redis overcommit_memory的问题,以及导致的:Cannot allocate memory问题
- visio2010 用键盘上的上下键为什么移动不了选中的部分,而是整个画布都在移动?...
- TCP/IP协议损坏解决方法:
- java jbpm工作流_[JAVA] Jbpm工作流引擎原理及Jbpm复杂流程实现视频课程
- iOS开发-学习规划及阶段性目标,学习方法整理
- MediaFormat api详解
- 早餐为啥不能吃大米粥?医生:不仅是米粥,这3物也最好少吃
- w ndows无法识别usb,surface pro3 windows无法识别USB设备
- 羊皮卷之七:我要笑遍世界
- 懒人教你用猕猴桃一月饱减16斤_过路老熊_新浪博客
- 扣哒世界python CS1 竞技场代码
- 去哪儿网被央视曝光,其实智慧旅行可以做到更多
- 双摄像头测距的OpenCV实现
- Web开发了一个完整精美的聊天室(登录部分引入了Vue技术)
- Linux:chmod命令
- 从《西游》《魔界》看东西方的团队与项目管理
热门文章
- Netty私有栈协议
- hdu 1027 STL next_permutation
- 计算机秋招必备!北京互联网大厂企业整理清单!
- 【已解决】java.lang.NullPointerException at line 15, Solution.r
- 想满分的看这里:1015 德才论 (25分)
- 算法竞赛入门经典(第二版) | 例题4-5 追踪电子表格中的单元格 (UVa512,Spreadsheet Tracking,World Finals)(解法一)
- 电信服务器维修人员职责,维修人员岗位职责
- linux启动后分区数据变化,求助!我删除了Linux启动分区
- java静态局部变量_java中成员变量,局部变量,静态变量的辨析
- 问题解决:错误:unable to connect to node rabbit@localhost: nodedown