Uber面试钟爱的背包问题,如何掌握?

作为动态规划类问题中非常重要的一个类别,背包问题已经慢慢地成为了面试高频题。

Uber这道面试题,把背包换成了别的词就直接拿出来用了,但是很多人都在这道题上,跪了......

现在我们一起来学习一下这道题。

题目描述

给出不同面额的硬币以及一个总金额,写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回-1.

样例1

        输入:
[1, 2, 5]
11
输出: 3
解释: 11 = 5 + 5 + 1
      

样例2

        输入: 
[2]
3
输出: -1
      

说明

这是一个典型的完全背包问题。
设dp[i][j]表示使用前i个硬币,总金额为j时需要的最少硬币数量。

v2-4cc09bfd4e70792d2cf70a56b2ca190e_b.jpg
        # 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的课程,现在:

  1. 戳我免费试听后,加微信号jiuzhang15,回复「知乎背包」+试听截图;
  2. 邀请2位未注册过九章官网的新朋友入群,组成3人学习小组;

3人都可领全额抵价券,0元听课!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值