分析:

首先这个题是一个完全背包问题,把面额看做是商品总金额看做背包容量,找出所有可能装满背包的方案。
首先想到肯定是动态规划,关键是找出动量关系式

例如:用1,2,5金额

已知0元的情况,直接不用任何面值可以记为1种情况。

1.当我们只有1元硬币的时候,只有一种结果
2.当我们有了2元硬币的时候,结果等于 没有2元硬币的结果数+确定用了一枚2元硬币下其余的金额随意搭配
3.到这里逻辑和转化方程就都已经清楚了f [i][j] = f [i − 1][j] + f [i][j − x]
最后拿总额11来再说明下:可以是之前没有5元面值的时候凑出11元的方案也可以是需要有5元面值硬币的时候凑出6元的方案加一个5元硬币.

代码:

import java.util.Scanner;
public class G {public static void main(String[] args) {int[] countis = {1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};Scanner sc = new Scanner(System.in);int n = sc.nextInt();for (int i = 0; i < n; i++) {int x = sc.nextInt();int dp = dp1(countis, x);System.out.println(dp);}}/*** @param countis 钱面额集合* @param number 钱总数* @return int*/public static int dp(int[] countis, int number) {int[][] answer = new int[countis.length + 1][number + 1];answer[0][0] = 1;//0个钱 0个面额的时候算一种情况int k = 0;//k是求得需要用到几个不同的面额数for (int i : countis) {if (number >= i) {k++;}}for (int i = 1; i < k + 1; i++) {for (int j = 0; j < number + 1; j++) {//这个位置的值=不用上个面额的值+必须用这个面额的值answer[i][j] = answer[i - 1][j] + (j - countis[i - 1] >= 0 ? answer[i][j - countis[i - 1]] : 0);}}return answer[k][number];}
}

优化:

每多出来一种面值硬币的可选项之后,都是在之前已得到方案的结果上进行叠加处理,那么可以只声明一个长度为amount+1的数组,在每多加一种面值硬币的时候就对结果进行重新叠加统计处理。而小于新加的硬币的面值的总额不必处理,和前面说到的情况一样。

1.预定义了dp[0] = 1
2.从面值为1的硬币开始遍历处理,当面值0的情况加1枚1元硬币,可以得到总额1,后面挨个加可以得到[1,1,1,1,1,1,1,1,1,1,1,1]的结果
3.新加入了面值2,在原来的基础上,面值为0的情况加1枚硬币2可以得到总额为2的情况1种,累加上原来面值为2的情况1种,此时可以有2中情况可以凑出面值2,后面依次遍历处理
4.最后新加了面值5,依旧从面值0开始加一个5元面值硬币则代表一种新的凑出5元的方案,加上原来的方案数量3种,此时可知有4种方法凑出5元
5.最后的11元等于之前的6种情况加上使用5元凑出6元的6种方案,一共11种方案
代码:

import java.util.Scanner;
public class G {public static void main(String[] args) {int[] countis = {1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};//面额集合Scanner sc = new Scanner(System.in);int n = sc.nextInt();for (int i = 0; i < n; i++) {int x = sc.nextInt();int dp = dp1(countis, x);System.out.println(dp);}}public static int dp1(int[] countis, int number) {int k = 0;//k是求得需要用到几个不同的面额数for (int i : countis) {if (number >= i) {k++;}}int[] answer = new int[number + 1];answer[0] = 1;//0个钱 0个面额的时候算一种情况for (int i = 0; i < k; i++) {for (int j = countis[i]; j < number + 1; j++) {//这个位置的值=不用上个面额的值+必须用这个面额的值answer[j] += answer[j - countis[i]];answer[j] %= 1000000007;}}return answer[number];}
}

Leetcode518. 零钱兑换 II(完全背包)相关推荐

  1. 算法训练Day44 动态规划专题- 背包问题 | 完全背包基础知识;LeetCode518. 零钱兑换(装满背包有多少种方法,组合数);377.组合总和IV(装满背包有多少种方法,排列数)

    前言: 算法训练系列是做<代码随想录>一刷,个人的学习笔记和详细的解题思路,总共会有60篇博客来记录,计划用60天的时间刷完.  内容包括了面试常见的10类题目,分别是:数组,链表,哈希表 ...

  2. leetcode518. 零钱兑换 II

    一:题目 二:上码 class Solution {public:/**思路:1.分析题意这个满足答案的结果有很多种,所以我们可以用动态规划去做,那么题意中我们可以知道的是我们是可以输入一种面值的时候 ...

  3. 代码随想录44——动态规划:完全背包理论基础、518零钱兑换II、377组合总和IV

    文章目录 1.完全背包理论基础 2.518零钱兑换II 2.1.题目 2.2.解答 3.377组合总和IV 3.1.题目 3.2.解答 4.组合和排列问题的便利顺序 4.1.组合问题 4.2.排列问题 ...

  4. 【leetcode题解——动态规划之完全背包】518.零钱兑换II(python版本详解+表格+dp五部曲)

    518. 零钱兑换 II 重点: 本题求组合数,而非排列数. 例如示例: 5 = 2 + 2 + 1 5 = 2 + 1 + 2 这是一种组合,都是 2 2 1,而(2,2,1)(2,1,2)为两种排 ...

  5. leetocde 518 零钱兑换II

    前言 题目:518. 零钱兑换 II 参考:完全背包问题-大草.零钱兑换 II-力扣官方题解 提交代码 我可以理解01背包的滚动数组,但是我理解不了完全背包的滚动数组. 理解不了,便用二维数组.虽然二 ...

  6. 518. 零钱兑换 II golang动态规划

    518. 零钱兑换 II 给定不同面额的硬币和一个总金额.写出函数来计算可以凑成总金额的硬币组合数.假设每一种面额的硬币有无限个. 示例 1: 输入: amount = 5, coins = [1, ...

  7. 【必备算法】动态规划:LeetCode题(六)322. 零钱兑换,518. 零钱兑换 II

    322. 零钱兑换² 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: ...

  8. java刷题--518零钱兑换II

    java刷题--518零钱兑换II 题目 代码 结果 题目 代码 class Solution {public int change(int amount, int[] coins) {int[] d ...

  9. leetcode:518. 零钱兑换 II

    518 零钱兑换 II 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/coin-change-2/ 给你一个整数数组 coins 表示不同面额的硬币 ...

最新文章

  1. GNU/LINUX(KaliUbuntu)安装chrome浏览器
  2. 控件授权:知道Infragitics是怎么限制别人使用它的控件了。
  3. Java内部类的定义和使用
  4. mysql索引结构优缺点_mysql索引优缺点及注意事项
  5. 餐饮小票在线生成_意大利电子小票发送截止日即将来临
  6. 在 TableLayoutPanel 控件中对齐和拉伸控件
  7. Brew Command Not Found
  8. wpf ListView圆角
  9. Hello,CNDS!(第一次博客)
  10. 360浏览器访问跨域问题
  11. Make sure ‘SystemCfg‘ is registered using qRegisterMetaType
  12. 网页打开微信/跳转微信
  13. 驼峰式命名法python_驼峰命名法
  14. Windows 好用的软件安装清单 持续更新
  15. 生活小知识,生活要认真,驱蚊驱虫驱苍蝇大法
  16. 数学分析笔记-有限覆盖定理
  17. FineReport 报表数据根据下拉框的值进行数据联动
  18. WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web appli
  19. 计算机考研复试面试常问问题 数据库篇
  20. R语言提取字符串的一部分substring函数

热门文章

  1. 0点到现在的秒数(北京时间)
  2. 廖雪峰python信息可视化设计_廖雪峰:数据分析全栈工程师第八期
  3. 清华版三年级上册计算机教案,清华版三年级上册信息技术教案
  4. 简单聊聊Promise
  5. 狼羽:增长黑客是什么?
  6. 如何实现不定宽高的div水平垂直居中
  7. 中国石油大学(北京)-《化学与社会》第二阶段在线作业
  8. 海尔推出空气盒子的背后阳谋
  9. win10 看不到局域网其他电脑怎么解决
  10. Linux查看mysql是否启动+mysql启动(全)