中级农民
- 积分
- 125
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-12-19
- 最后登录
- 1970-1-1
|
DP的做法,代码比较糙,但是能跑对,目前还没有遇到不正确的case,欢迎各位同学指正。
- import sys
- class Solution:
- def coin_change(self, coins, nums, amount):
- # 一共有多少个硬币,给硬币编号
- total = 0
- for n in nums:
- total += n
- # 先初始化成 一维数组
- dp = [0] * total
- index = 0
- while index < total:
- dp[index] = [0] + [sys.maxsize] * amount
- index += 1
- money = []
- for i, c in enumerate(coins):
- money += [c] * nums[i]
- # dp[i][j] 是说,编号是 i 的硬币可以参与 (只有两个选择,用上这个硬币,或者不用) 的时候, j 这么多钱最少要多少硬币
- for i in range(0, total):
- for j in range(0, amount + 1):
- if j - money[i] == 0:
- dp[i][j] = 1
- elif j - money[i] < 0:
- if (i >= 1):
- dp[i][j] = dp[i - 1][j]
- else:
- # 第一个硬币,没有更前面的一个硬币了,不用考虑,就是 sys.maxsize, 初始化的时候设置好了
- # 而且在一直用到前一个硬币的情况下,扣去现在考虑的这枚硬币的面值之后,还能有解决方案的时候
- # 就可以考虑哪一个方案用的硬币更少了
- if i != 0:
- if dp[i - 1][j - money[i]] != sys.maxsize:
- dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - money[i]] + 1)
- else:
- dp[i][j] = dp[i - 1][j]
- return dp[total - 1][amount] if dp[total - 1][amount] != sys.maxsize else -1
- if __name__ == "__main__":
- print(Solution().coin_change([1, 2, 5], [1, 1, 1], 8))
- print(Solution().coin_change([1, 2, 5], [1, 8, 3], 16))
- print(Solution().coin_change([7, 2, 5], [1, 5, 1], 8))
- print(Solution().coin_change([1, 2, 5, 6], [1, 1, 1, 1], 8))
- print(Solution().coin_change([7, 2, 5, 10], [2, 1, 1, 1], 14))
- print(Solution().coin_change([7, 2, 5, 10], [1, 2, 1, 1], 14))
复制代码 |
|