首页 > 其他分享 >322 - Coin Change 换零钱

322 - Coin Change 换零钱

时间:2024-05-16 21:19:00浏览次数:18  
标签:换零钱 int coins 322 零钱 amount Coin dp

问题描述

You are given an integer array coins representing coins of different denominations and an integer amount representing a total amount of money.

Return 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.

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

动态规划中非常经典的换零钱,零钱数量不计,给定整数amount,求使用最少的零钱构成amount,求零钱数量。如果零钱没办法组成 amount,则返回-1

案例:

Input: coins = [1,2,5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
解析: 两个零钱5 叠加1,构成11,所以结果是3

基本思想

非常经典的换零钱,零钱数量不计。假设 coins的大小为m

构造数组 dp,长度为amount+1,其中dp[i] 表示 conis组成 i的最少零钱数。则、

dp[i] 取决于 \(dp[i - coins[0]]\) , \(dp[i - coins[1]]\),...... \(dp[i - coins[m-1]]\)

即 dp[i] = min( \(dp[i - coins[0]]\) , \(dp[i - coins[1]]\),...... \(dp[i - coins[m-1]]\)) + 1

时间复杂度: \(o(m*n)\)

代码

C++

    int coinChange(vector<int>& coins, int amount) {
        int n = coins.size();
        if (n<=0 || amount <=0) return 0;
        vector<int> dp(amount+1,-1);
        sort(coins.begin(), coins.end());
        for(int i=0;i<coins.size();++i) {
            if (coins[i]<=amount)
              dp[coins[i]] = 1;
        }
        for(int i=1;i<=amount;++i) {
            int t = INT_MAX;
            for(int j=0;j<coins.size();++j) {
                if ((i - coins[j]) <= 0 || (dp[i-coins[j]] == -1))
                  continue;
                if (dp[i]>0) continue;
                t = min(t, dp[i-coins[j]]+1);   
            } 
            
            if (t<INT_MAX) dp[i] = t;
        }
        return dp[amount];
    }

python

    def coinChange(self, coins: List[int], amount: int) -> int:
        if amount <=0: return 0;
        n = len(coins)
        dp = [-1] * (amount+1)
        coins.sort()
        for coin in coins:
            if coin > amount: continue
            dp[coin] = 1
        for i in range(1, amount+1):
            t = amount + 1
            for coin in coins: 
                if i <= coin or (dp[i-coin] == -1):
                    continue
                if dp[i] > 0: 
                    continue
                t = min(t, dp[i-coin]+1)
            if t < (amount+1): dp[i] = t
        return dp[amount]

标签:换零钱,int,coins,322,零钱,amount,Coin,dp
From: https://www.cnblogs.com/douniwanli/p/18196750

相关文章

  • B. Coin Games
    原题链接题解1.在一次op后,哪些东西发生了变化?哪些东西没变?2.题目要求当一个u都没有的时候先手输,那么我一次op能减几个u?3.通过分类讨论发现一次op总是使u的数量加减一个奇数,所以如果alice要赢,那么起始u的数量必须是奇数code#include<bits/stdc++.h>usingnamespacestd;int......
  • FAT322与NTFS的区别
    FAT322与NTFS的区别FAT32和NTFS是两种不同的文件系统,它们之间存在一些显著的区别。以下是FAT32与NTFS的主要区别:支持的分区大小:FAT32文件系统最大只支持32GB分区,每个分区只能存放2GB的信息。然而,NTFS文件系统则可以支持高达2TB的单个分区。文件大小限制:FAT32单个文件大小不能......
  • Nftables漏洞原理分析(CVE-2022-32250)
    前言在nftales中存在着集合(sets),用于存储唯一值的集合。sets 提供了高效地检查一个元素是否存在于集合中的机制,它可以用于各种网络过滤和转发规则。而CVE-2022-32250漏洞则是由于nftables在处理set时存在uaf的漏洞。环境搭建ubuntu20+QEMU-4.2.1+Linux-5.15.config文件......
  • 车用MCU,R7F701320EAFP、R7F701321EAFP、R7F701322EAFP、R7F701323EAFP微控制器功耗低,
    RH850/P1M——适用于底盘系统的汽车用微控制器简介RH850/P1M微控制器功耗低,闪存容量高达2MB,RAM容量高达128KB,具有增强型电机控制定时器、CAN接口、SENT和PSI5等传感器数字接口以及锁定CPU、ECC、BIST(内置自检)和ECM(错误控制模块)等安全功能,适用于底盘系统。此外,仅2......
  • cf gym101981e Eva and Euro coins
     20182019-acmicpc-asia-nanjing-regional-contest-en.pdf(codeforces.com) 这类字符串的能否从s状态到达t状态的题。还可以删除若干子串后然后比较。感觉是一种套路。 100↔111↔001011↔000↔110 01001↔10010可以移动 用栈,如果找到k个连续相同,然后栈删掉这k......
  • LOJ3224
    nb题。感觉相当Educational。自己做的时候大概试了试[HAOI2017]方案数的维护方式;模拟BFS维护每一行能到达的状态等。但没一个可行的。一个DS维护的trick:保留关键元素。本题中最特殊的肯定是最靠上,最靠下的两条路径。尝试只维护这两条路径,分别设为\(P_1,P_2\)。一......
  • CF875B Sorting the Coins 题解
    题面。算是比较简单的题目了,自己多手出几个样例就可以发现规律了。强烈建议多读几遍题目!!!!思路设0表示硬币朝上,1表示硬币朝下,则第\(0\)次与第\(n\)操作一定输出\(1\)。因为没有可以操作的对象,前者是由于全部硬币朝上,后者是由于全部硬币朝下,即使没有操作也要遍历一遍。注......
  • SiT8008BI-22-33E-50.000000D 标准时钟振荡器 3225 50MHz SiTime
    SiT8008BI-22-33E-50.000000D是SiTime公司出产的一款振荡器产品的类型。SiTime是一家专心于供给高性能、高精度、低功耗的振荡器解决方案的公司。是SiTime公司出产的一款振荡器产品的类型。SiTime是一家专心于供给高性能、高精度、低功耗的振荡器解决方案的公司。制造......
  • Linux 运行 Bitcoin 软件
    首先进入官网bitcoin.org下载BitcoinCore。下载得到tar.gz文件后解压,并安装:tarxzfbitcoin-25.0-x86_64-linux-gnu.tar.gzsudoinstall-m0755-oroot-groot-t/usr/local/binbitcoin-25.0/bin/*使用bitcoin-qt命令打开BitcoinCore图形界面。如果提示lib......
  • CF1934B Yet Another Coin Problem 题解
    CF1934BYetAnotherCoinProblem题解题意目前有\(5\)种硬币,面值分别为\(1,3,6,10,15\)。给你一个数字\(n\),求出可以凑出\(n\)的最少的硬币的数量。思路这道题,大多数的人大概会想到动态规划的方法。但是,我们应该有敢于创新的精神。于是我就想到了一个简单的数学方法......