鱼C论坛

 找回密码
 立即注册
查看: 229|回复: 2

递归题代码如何修改

[复制链接]
发表于 2024-11-5 17:13:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
322. 零钱兑换
中等
相关标签
相关企业
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。
题目描述如上,代码如下
  1. class Solution:
  2.     def coinChange(self, coins: List[int], amount: int) -> int:
  3.         res = float('inf') #比较数组长度,存放最小的
  4.         ans = [] #存放每个满足条件的数组
  5.         def dfs(coins,target):
  6.             
  7.             for coin in coins:        
  8.                     ans.append(coin)
  9.                     target -= coin
  10.                     if target == 0:
  11.                         res = min(res,len(ans))
  12.                     elif target < 0:
  13.                         return
  14.                     else:
  15.                         dfs(coins,target)
  16.             return res
  17.         dfs(coins,amount)
  18.                

复制代码

怎么修改代码以使target为负时返回上一层级节点
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-11-5 17:13:52 | 显示全部楼层
你可以通过在递归函数中加入回溯的步骤来解决这个问题。当 `target` 为负时,需要从当前层级返回,同时将之前尝试加入 `ans` 的硬币再移除掉。

以下是修改后的代码:

  1. class Solution:
  2.     def coinChange(self, coins: List[int], amount: int) -> int:
  3.         self.res = float('inf')  # 使用实例变量来存储全局最小值
  4.         ans = []  # 存放每个满足条件的数组

  5.         def dfs(target):
  6.             # 当 target 为负数时,直接返回
  7.             if target < 0:
  8.                 return

  9.             # 当 target 为零时,更新最小硬币数量
  10.             if target == 0:
  11.                 self.res = min(self.res, len(ans))
  12.                 return

  13.             for coin in coins:
  14.                 ans.append(coin)  # 选中一个硬币
  15.                 dfs(target - coin)  # 继续递归搜索
  16.                 ans.pop()  # 回溯:移除最后一个硬币,返回上一层级

  17.         dfs(amount)
  18.         
  19.         # 如果 res 没有被更新,返回 -1
  20.         return self.res if self.res != float('inf') else -1
复制代码


这里的关键是加入了 `ans.pop()`,这一步用于在递归返回时移除上一次选中的硬币,以确保在新的递归路径中可以尝试不同的组合。这种回溯的手法可以有效避免重复和不必要的计算。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-5 20:05:29 | 显示全部楼层
本帖最后由 jackz007 于 2024-11-5 20:23 编辑

        试试这个代码
  1. class Solution:
  2.     def coinChange(self , coins: list[int] , amount: int) -> int:
  3.         coins . sort(reverse = True)
  4.         e , i , r = [0 for _ in range(len(coins))] , 0 , amount
  5.         while r > 0 and i < len(coins) :
  6.             if r >= coins[i] :
  7.                 e[i] , r = r // coins[i] , r % coins[i]
  8.             i += 1
  9.         return sum(e) if not r else -1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 17:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表