322. 零钱兑换
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1
示例 2:输入:coins = [2], amount = 3
输出:-1
示例 3:输入:coins = [1], amount = 0
输出:0

DFS 搜索树太深直接超时

from typing import Listclass Solution:def coinChange(self, coins: List[int], amount: int) -> int:coins.sort(reverse=True)self.coins_num_res = float("inf")def dfs(start, coins_num, residue):if residue == 0:self.coins_num_res = min(self.coins_num_res, coins_num)returnfor index in range(start, len(coins)):dfs(index + 1, coins_num, residue)  # dfs 路径1, 不选当前的硬币if coins[index] > residue:  # 当前的硬币选了后钱会多,剪枝continue# 剪枝,coins_num_res 有结果。# 剪枝了也会超时if self.coins_num_res != float("inf") and (self.coins_num_res - coins_num) * coins[start] < residue:breakdfs(index, coins_num + 1, residue - coins[index])  # # dfs 路径2, 选上当前的硬币dfs(0, 0, amount)return self.coins_num_res if self.coins_num_res != float("inf") else -1print(Solution().coinChange([1, 2, 5], 11))
# print(Solution().coinChange([411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422], 9864))

BFS 最快的

构建BFS搜索必然借助deque,但是deque里面装什么,怎么搜,始终不太好想象:

from typing import Listclass Solution:def coinChange(self, coins: List[int], amount: int) -> int:from collections import dequequeue = deque([amount])step = 0visited = set()while queue:n = len(queue)for _ in range(n):  # 本轮选择硬币residue = queue.pop()if residue == 0:return stepfor coin in coins:# residue >= coin 是停止条件# (residue - coin) not in visited 是剪枝if residue >= coin and (residue - coin) not in visited:visited.add(residue - coin)queue.appendleft(residue - coin)step += 1return -1print(Solution().coinChange([411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422], 9864)) # 3万多次循环

动态规划

class Solution1:def coinChange(self, coins: List[int], amount: int) -> int:dp = [float('inf')] * (amount + 1)dp[0] = 0for coin in coins:for x in range(coin, amount + 1):dp[x] = min(dp[x], dp[x - coin] + 1)return dp[amount] if dp[amount] != float('inf') else -1

【算法题目】DFS BFS 动态规划 零钱兑换 Python相关推荐

  1. python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS

    在计算机科学, 图遍历(Tree Traversal,也称图搜索)是一系列图搜索的算法, 是单次访问树结构类型数据(tree data structure)中每个节点以便检查或更新的一系列机制.图遍历 ...

  2. python换零钱_python动态规划-零钱兑换

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

  3. 动态规划——零钱兑换(Leetcode 322)

    题目选自Leetcode 322.零钱兑换 想必大家看一眼就明白了(bushi),这就是动态规划的背包问题~ 算法思想 那么,既然知道了这是个动态规划问题,就要思考如何列出正确的状态转移方程? 1.确 ...

  4. 动态规划——零钱兑换问题

    零钱兑换问题 I 1.题目:力扣原题 2.分析 (1)结合我们之前分析的(动态规划解决背包问题),这里硬币有无限个对应完全背包问题.但又存在一点区别:纯完全背包是能否凑成总的金额,本题是要求凑成总金额 ...

  5. [Leedcode][JAVA][第22题括号生成][DFS][BFS][动态规划]

    [问题描述]22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 示例:输入:n = 3 输出:["((()))",&q ...

  6. c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)

    深度优先搜索算法(Depth First Search) DFS是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始 ...

  7. 算法题目——爬楼梯(动态规划)

    题目链接:70.爬楼梯 类似题目:1646.获取生成数组中最大值 本题大家如果没有接触过的话,会感觉比较难,多举几个例子,就可以发现其规律. 爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法. 那么第 ...

  8. 【数据结构与算法】之深入解析“零钱兑换II”的求解思路与算法示例

    一.题目要求 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额,请你计算并返回可以凑成总金额的硬币组合数,如果任何硬币组合都无法凑出总金额,返回 0. 假设每一 ...

  9. 【数据结构与算法】之深入解析“零钱兑换”的求解思路与算法示例

    一.题目要求 给你一个整数数组 coins,表示不同面额的硬币:以及一个整数 amount,表示总金额. 计算并返回可以凑成总金额所需的最少的硬币个数,如果没有任何一种硬币组合能组成总金额,返回 -1 ...

最新文章

  1. Java学习总结:16
  2. 计算机中列英语,计算机中常用的英文缩写有哪些?
  3. Centos 7和Centos 6的防火墙
  4. Topcoder SRM 630div 2
  5. js文件,同样的路径,拷贝过来的为什么不能访问
  6. 从 Google 代码库找到的好东西 [转]
  7. sparkstreaming消费receive
  8. java svg to png_如何用Image Magick将SVG转换为PNG?
  9. OpenGL教程 学习笔记
  10. 几种基本汇编指令详解
  11. 清明祭娭毑_原水_新浪博客
  12. postgres mysql quora_DesktopReader for Quora
  13. [项目]PHP图书管理系统(附源码)
  14. Team Queue -uva
  15. python 给定一个字符串,输出所有指定长度为n的子串,没有则输出-1
  16. dockerMySQL数据库主从一主一从
  17. AI中的几种搜索算法---A*搜索算法
  18. SteamVR 2.x 手柄拾取3D物体(13)
  19. 什么邮箱发送邮件不进垃圾箱,邮件进垃圾箱了是什么原因怎么办?
  20. 【Python】爬取百度图片和必应图片

热门文章

  1. 在线卖家商品售价自动推荐(上)
  2. 崮德好文连载 - 活该你是工程师(个人如何成长?)
  3. [Armory]实现相机的漫游功能
  4. /proc/sysrq-trigger 机制浅析
  5. python 代码实现短信发送
  6. 简单 3 步配置 Google Play Billing | 系列分享
  7. Oracle SQL符号分隔的多行字符串拆分
  8. 平安科技前端开发面试总结
  9. 详解HRNet姿态估计算法
  10. [C语言] [典例详解] 打印杨辉三角(找规律简单实现)