📜  硬币变化 | DP-7(1)

📅  最后修改于: 2023-12-03 14:56:30.987000             🧑  作者: Mango

硬币变化 | DP-7

简介

问题描述:假设有面值为1元、3元、5元的硬币若干枚,需要找零n元,请问最少需要多少枚硬币?

该问题是经典的动态规划问题,可以采用自下而上的方式逐步求解。

解题思路
  1. 定义状态:使用dp[i]表示找零i元所需的最少硬币数目。
  2. 初始化:dp[0]=0,即找零0元所需的最少硬币数为0。
  3. 状态转移方程:考虑新增一枚硬币j,假设该硬币的面值为v[j],则使用该硬币的总金额为v[j]+dp[i-v[j]]。因此,dp[i]的值可以由dp[i-v[j]]加一得到。那么,dp[i]的值就是对于每一枚硬币取最小值。

最终返回dp[n]即可。

时间复杂度

时间复杂度为O(n*k),其中n为找零金额,k为硬币面值数量。

代码实现
def coinChange(coins, amount):
    n = amount + 1
    dp = [n] * n
    dp[0] = 0
    
    for i in range(1, n):
        for j in range(len(coins)):
            if coins[j] <= i:
                dp[i] = min(dp[i], dp[i-coins[j]] + 1)
    
    return -1 if dp[amount] > amount else dp[amount]
int coinChange(vector<int>& coins, int amount) {
    vector<int> dp(amount+1, amount+1);
    dp[0] = 0;
    for(int i=0; i<=amount; i++){
        for(int j=0; j<coins.size(); j++){
            if(coins[j] <= i){
                dp[i] = min(dp[i], dp[i-coins[j]]+1);
            }
        }
    }
    return dp[amount] > amount ? -1 : dp[amount];
}
## 参考链接

- [leetcode 322. Coin Change](https://leetcode.com/problems/coin-change/)
- [动态规划-硬币找零问题](https://blog.csdn.net/qq_37663900/article/details/80834073)