当前位置: 首页 > news >正文

518. 零钱兑换 II ——【Leetcode每日一题】

518. 零钱兑换 II

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0

假设每一种面额的硬币有无限个。

题目数据保证结果符合 32 位带符号整数。

示例 1:

输入:amount = 5, coins = [1, 2, 5]
输出:4
解释:有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

示例 2:

输入:amount = 3, coins = [2]
输出:0
解释:只用面额 2 的硬币不能凑成总金额 3 。

示例 3:

输入:amount = 10, coins = [10]
输出:1

提示:

  • 1 <= coins.length <= 300
  • 1 <= coins[i] <= 5000
  • coins 中的所有值 互不相同
  • 0 <= amount <= 5000

思路:

此问题属于 0-1背包 的 完全背包 ,解法和 0-1背包类似:

0 - 1背包问题(万能统一代码)

定义一个二维数组dp 存储硬币组合数,其中 dp[i][j] 表示前 i 个硬币 可以凑成总金额 为 j 的 硬币组合数

  • 每种硬币的数量是无限的,所以可以重复使用
  • 状态转移方程为:
    dp[i][j]=dp[i−1][j]+dp[i][j−coins[i]]dp[i][j] = dp[i - 1][j] + dp[i][j - coins[i]]dp[i][j]=dp[i1][j]+dp[i][jcoins[i]]

示例1 的dp二维数组为:

在这里插入图片描述

观察前 i 个硬币的状态仅与前 i -1 个硬币的状态有关,因此可以优化,将 dp 定义为一维数组,其中 dp[j] 既可以表示 dp[i-1][j] 也可以表示 dp[i ][j - coins[i]]:状态转移方程为:
dp[j]+=dp[j−coins[i]]dp[j] += dp[j - coins[i]]dp[j]+=dp[jcoins[i]]

代码:(Java)

public class Change {public static void main(String[] args) {// TODO Auto-generated method stubint[] coins = {1, 2, 5};int amount = 5;System.out.println(change(amount, coins));}public static int change(int amount, int[] coins) {int[] dp = new int[amount + 1];dp[0] = 1;for(int coin : coins) {for(int i = coin; i <= amount; i++) {dp[i] += dp[i - coin];}}return dp[amount];}
}

运行结果:

在这里插入图片描述

复杂度分析:

  • 时间复杂度O(len∗amount)O(len * amount)O(lenamount), lenlenlen 为数组 coinscoinscoins 的长度,amountamountamount 为要凑成的总金额。
  • 空间复杂度O(amount)O(amount)O(amount) ,需要开辟一个一维数组 dp , 长度为amount+1amount + 1amount+1amountamountamount 为要凑成的总金额。

322. 零钱兑换 I

注:仅供学习参考 如有不足,欢迎指正!

题目来源:力扣。

http://www.lryc.cn/news/40145.html

相关文章:

  • django DRF请求访问频率限制
  • 二分查找创新性总结
  • Java Web 实战 13 - 多线程进阶之 synchronized 原理以及 JUC 问题
  • 【解决】elementui ——tooltip提示在循环中点击一个,同时显示多个的问题!
  • SpringBoot-核心技术篇
  • 2023还有人不知道kubernetes?| 初步理解kubernetes
  • Docker 环境搭建
  • css实现炫酷充电动画
  • 【Effective C++详细总结】第二章 构造/析构/赋值运算
  • webpack基础
  • jQuery《一篇搞定》
  • Spring Cloud学习笔记【负载均衡-Ribbon】
  • 第九章:C语言数据结构与算法初阶之堆
  • Mysql架构初识
  • 字符串函数和内存函数
  • Web3中文|GPT-4超越GPT-3.5的五大看点
  • 动态矢量瓦片缓存库方案
  • 628.三个数的最大乘积
  • 【数据结构】堆和集合笔记
  • java LinkedList 源码分析(通俗易懂)
  • Vue中实现路由跳转的三种方式详细分解
  • 全国自学考试03708《中国近现代史纲要》重点复习精要
  • 数据库面试题——锁
  • Python笔记 -- 文件和异常
  • 蓝桥杯刷题冲刺 | 倒计时24天
  • 真正理解微软Windows程序运行机制——什么是消息
  • HTTP 缓存的工作原理
  • RK3568在Android上进行驱动模块开发(源码外)
  • 操作技巧 | 在Revit中借用CAD填充图案的方法
  • Java的二叉树、红黑树、B+树