322. 零钱兑换

       

        采用记忆化搜索方法,将问题转化为完全背包模型,即使用无限数量的物品来凑出目标金额amount。

边界条件处理:

  • 当物品下标为负数时,表示没有可用物品
    • 若当前金额恰好为0,说明成功凑出目标金额
    • 否则视为无效方案,返回INT_MAX表示不合法

非边界条件处理:

  • 当前物品面值大于剩余金额时: 直接继承前i-1个物品凑出金额c的最小硬币数
  • 否则: 比较两种情况,取最小值:
    1. 使用当前物品:前i-1个物品凑出(c - coins[i])的最小硬币数加1
    2. 不使用当前物品:前i-1个物品凑出c的最小硬币数
  • class Solution {
    public:
        int coinChange(vector<int>& coins, int amount) {
            int n = coins.size();
            vector<vector<int>> cache(n,vector<int>(amount + 1,-1));
            auto dfs = [&] (this auto && dfs,int i,int c)->int {
                if (i < 0) {
                    return c == 0 ? 0 : INT_MAX / 2;
                }
                if (cache[i][c] != -1) {
                    return cache[i][c];
                }
                if (c < coins[i]) {
                    return cache[i][c] = dfs(i - 1,c);
                }
                return cache[i][c] = min (dfs(i - 1,c) , dfs(i,c - coins[i]) + 1);
            };
            int ans = dfs(n - 1,amount);
            return ans == INT_MAX / 2 ? -1:ans;
        }
    };

    时间复杂度:O(n*amount) 
    空间复杂度:O(n*amount)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值