100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 动态规划算法(DP) JAVA 菜鸟理解

动态规划算法(DP) JAVA 菜鸟理解

时间:2022-11-25 18:57:38

相关推荐

动态规划算法(DP) JAVA 菜鸟理解

不知道动态规划是啥,搜索到这篇动态规划算法(DP)

现在把java版的动态规划理解记录一下

题目描述

给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N员(N为0-10000的非负整数)的不同组合的个数。

输入描述:

输入为一个数字N,即需要拼凑的面额

输出描述:

输出也是一个数字,为组成N的组合个数。

首先要有一个DP表格的想法

单元格的值 为当前金额,用当前拥有货币的组合方法

比如那个加粗的 4 的意思是 用{1 5 10} 3种货币 有4种组合方式可以组合成10元

//定义拥有的币种int[] money = {1, 5, 10, 20, 50, 100};//需要组成的金额int n = 10;//存储行的组合次数int[] li = new int[n + 1];//设定初始值li[0] = 1;//拿到当前拥有最大金额for (int m : money) {//遍历需要组合的金额for (int i = 1; i <= n; i++) {//如果当前金额可以组成if (i >= m) {// i-m =(当前金额-需要组合金额)//li[i-m] = (当前金额-需要组合金额)组合的需要次数//li[i] = 上一次的组合总次数 + (当前金额-需要组合金额)金额 组合的需要次数//用加粗的4解释就是 4 = 3+1;//3 = DP[5][10] //1 = DP[5][0] li[0]默认为1li[i] = li[i] + li[i - m];}}}

完整版代码

跑两遍就很直观了

public class Main {public static void main(String[] args) {//定义拥有的币种int[] money = {1, 5, 10, 20, 50, 100};//需要组成的金额int n = 10;//存储行的组合次数int[] li = new int[n + 1];//设定初始值li[0] = 1;//输出X轴值 (需要合成的金额)System.out.printf("%4d | ", 0);for (int i = 1; i < n + 1; i++) {System.out.printf("%4d", i);}//为了美观。。。。没有意义System.out.println();for (int i = 0; i < n + 2; i++) {System.out.printf("%4s", "——");}System.out.println();for (int m : money) {//输出Y轴坐标轴值 (拥有金额)System.out.printf("%4d | ", m);for (int i = 1; i <= n; i++) {if (i >= m) {li[i] = li[i] + li[i - m];}}sout(li);}}//输出当前组合值private static void sout(int[] li) {for (int i = 1; i < li.length; i++) {System.out.printf("%4d", li[i]);}System.out.println();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。