Leetcode: 322. Coin Change(Week8, Medium)

17 篇文章 1 订阅

注:本题是需要装满的完全背包问题


Leetcode 322
You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:
coins = [2], amount = 3
return -1.

Note:
You may assume that you have an infinite number of each kind of coin.

Credits:
Special thanks to @jianchao.li.fighter for adding this problem and >creating all test cases.

  • 题意:

    • 现提供不同硬币值域与需找的零钱amount,要求找到一种搭配,使得硬币的总值等于amount且数量最少。如果找到搭配的,则返回使用的硬币数量;如果找不到搭配,则返回-1
    • 每种硬币都可以重复使用,且它们的和应当等于amount
  • 思路:

    • 该题本质上是背包问题,更细致的说,是需要填满的完全背包
    • 首先它的状态是amount
    • 其次它的状态转移方程是v[i] = Min(v[i], v[i-coins[j]]+1)
  • 代码

class Solution {
public:
    int Min(int a, int b) {
        return (a < b) ? a : b;
    }
    int coinChange(vector<int>& coins, int amount) {
        vector<int> vec(amount+1, amount+1);
        vec[0] = 0;
        for (int i = 1; i <= amount; i++) {
            for (int j = 0; j < coins.size(); j++) {
                if (i >= coins[j])
                    vec[i] = Min(vec[i], vec[i-coins[j]]+1);
            }
        }
        return (vec[amount] >= amount+1) ? -1 : vec[amount];
    }
};

以上内容皆为本人观点,欢迎大家批评和指导,我们一起探讨!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值