鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: zltzlt

[已解决]Python:每日一题 314

[复制链接]
发表于 2020-1-25 22:21:26 | 显示全部楼层
zltzlt 发表于 2020-1-25 22:11
输入 amount = 500,coins = [1, 2, 5] 就会超时

算法不好,有待更改,迷上了递归,看见啥都想递归一下
这个用例大约用时15秒
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-25 22:22:10 | 显示全部楼层
wanting-for 发表于 2020-1-25 22:21
算法不好,有待更改,迷上了递归,看见啥都想递归一下
这个用例大约用时15秒


小心超出递归深度
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-25 22:23:54 | 显示全部楼层
zltzlt 发表于 2020-1-25 22:22
小心超出递归深度

嘿嘿,我想到优化方法了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-27 15:59:38 | 显示全部楼层
  1. from itertools import product

  2. def fun314(amount,coins):
  3.     if amount%min(coins):
  4.         repeat = (amount//min(coins))+1
  5.     else:
  6.         repeat = amount//min(coins)
  7.     result = []
  8.     for i in range(1,repeat+1):
  9.         for j in product(coins,repeat=i):
  10.             if sum(j)==amount and sorted(j) not in result:
  11.                 result.append(sorted(j))
  12.     return len(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-31 23:12:37 | 显示全部楼层
Croper 发表于 2020-1-25 15:18
总感觉还能优化

你这道题的想法是什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-1 16:03:53 From FishC Mobile | 显示全部楼层
本帖最后由 Croper 于 2020-2-1 16:07 编辑
fan1993423 发表于 2020-1-31 23:12
你这道题的想法是什么?


还是动态规划。
在把硬币面值数组coins从小到大排序后,
使用l[a][ b]储存在要求金额为a时,使用前b+1种硬币能凑出的方案数量。
显然在a=0时,不管b为多少,结果都为0(不取任何硬币)。
在a!=0时,考虑凑出的方案中面值最大硬币其面值为coins[c],那么剩余的硬币金额都不大于coins[c],可用方案数量为l[a-coins[c]][c]。且有c不大于 b。
即状态转移公式为l[a][ b]=l[a-coins[0]][0]+l[a-coins[1]][1]+...+l[a-coins[ b]][ b]
最终答案就为l[amount][len(coins)-1]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 02:04:58 | 显示全部楼层
  1. def fun314(amount,coins):
  2.     coins.sort()
  3.     dp=[[1]+[0]*amount for _ in range(len(coins)+1)]
  4.     for i in range(1,len(coins)+1):
  5.         for j in range(1,amount+1):
  6.             if j>=coins[i-1]:
  7.                 dp[i][j]=dp[i-1][j]+dp[i][j-coins[i-1]]
  8.             else:
  9.                 dp[i][j]=dp[i-1][j]
  10.     return dp[-1][-1]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 21:53:23 From FishC Mobile | 显示全部楼层
fan1993423 发表于 2020-4-17 02:04

虽然费空间,但是清晰易懂,赞
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 22:12:57 | 显示全部楼层
kinkon 发表于 2020-4-17 21:53
虽然费空间,但是清晰易懂,赞

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-18 13:28:53 | 显示全部楼层

输入 amount = 11, coins = [1, 2, 5] 结果有误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 15:05:01 | 显示全部楼层
zltzlt 发表于 2020-4-18 13:28
输入 amount = 11, coins = [1, 2, 5] 结果有误

难道输出的结果不是11吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-18 17:01:58 | 显示全部楼层
fan1993423 发表于 2020-4-18 15:05
难道输出的结果不是11吗?

是 3
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 20:56:35 | 显示全部楼层

难道我的理解有误
11=11*1+0*2+0*5
=9*1+1*2+0*5
=7*1+2*2+0*5
=5*1+3*2+0*5
=3*1+4*2+0*5
=1*1+5*2+0*5
=6*1+0*2+1*5
=4*1+1*2+1*5
=2*1+2*2+1*5
=0*1+3*2+1*5
=1*1+0*2+2*5
共计11种方案,而且你选的最佳答案在输入(11,[1,2,5])也是输出的11

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-19 13:21:15 | 显示全部楼层
fan1993423 发表于 2020-4-18 20:56
难道我的理解有误
11=11*1+0*2+0*5
=9*1+1*2+0*5

额……测试用例出错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 14:39:43 | 显示全部楼层
zltzlt 发表于 2020-4-19 13:21
额……测试用例出错了

耗时怎么样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 17:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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