作为动态规划类问题中非常重要的一个类别,背包问题已经慢慢地成为了面试高频题。
这道面试题,把背包换成了别的词就直接拿出来用了,但是很多人都在这道题上,跪了…
现在我们一起来学习一下这道题。
题目描述
给出不同面额的硬币以及一个总金额,写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回-1
.
样例1
输入:
[1, 2, 5]
11
输出: 3
解释: 11 = 5 + 5 + 1
样例2
输入:
[2]
3
输出: -1
说明
这是一个典型的完全背包问题。
设dp[i][j]表示使用前i个硬币,总金额为j时需要的最少硬币数量。
# This reference program is provided by @jiuzhang.com
# Copyright is reserved. Please indicate the source for forwarding
class Solution:
"""
@param coins: a list of integer
@param amount: a total amount of money amount
@return: the fewest number of coins that you need to make up
"""
def coinChange(self, coins, amount):
# write your code here
MAX = 100000000000000
ans = [MAX for i in range(amount + 1)]
ans[0] = 0
for i in range(1, amount + 1):
for coin in coins:
if i - coin < 0:
continue
ans[i] = min(ans[i], ans[i - coin] + 1)
if ans[amount] == MAX:
return -1;
return ans[amount];
此为Python解法,Java,C++解法见Lincode
如果你没认出这是背包问题,最好去听一听《背包四讲》,基础知识和刷题都覆盖到了。
这门原价$199的课程,现在:
戳我免费试听后,加微信号jiuzhang15,回复「v2ex背包」+试听截图,即可免费获得本课程~
听完背包四讲之后,明晚20:00九章还为大家准备了一场免费MapReduce编程讲座哦~ 快来报名吧~
报名链接:https://www.jiuzhang.com/seminar/152/?utm_source=sc-csdn-fks
课程内容:
- 解析MapReduce原理,夯实基础,厚积薄发。
- 精讲Hadoop核心组件——MapReduce执行流程,掌握入门大数据必备知识。
- 通过WordCount经典案例深入探索MapReduce原理,融会贯通,加强记忆。
讲师介绍: 韩愈
前BAT员工,有多年大厂工作经验,一直从事大数据技术与Java技术研究。目前在国内高校任教,有丰富的教学经验,了解学生思维模式,能够因材施教。
开课时间:2020/3/28 20:00
添加VX:jiuzhang10,回复“MR”还可进入讲座直播群哦~
报名链接:https://www.jiuzhang.com/seminar/152/?utm_source=sc-csdn-fks