零钱兑换(LeetCode 322)

题意

各种币值的硬币个数充足,如何使用最少的硬币凑出指定的钱

思路

这个题使用动态规划解题。当前的状态只与币值的种类有关,所以是线性动态规划

状态定义:
dp[i] : 凑出i块钱,所需硬币的最小个数为dp[i]

状态转移方程:
dp[i] = min(dp[i - j], j is the value of coins)

初始状态:
dp[0] = 0

代码

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        if(amount == 0)
        {
            return 0;
        }
        vector<int> dp(amount+1, INT_MAX);
        dp[0] = 0;

        for(int i = 1; i <= amount; i++)
        {
            for(auto value : coins)
            {
                if(i - value >= 0)
                {
                    dp[i] = min(dp[i], dp[i-value]);
                }
                
            }
            if(dp[i] != INT_MAX)
                dp[i] += 1;
        }
        if(dp[amount] == INT_MAX)
            return -1;
        return dp[amount];

    }
};
// dp[i] : 凑齐i块钱,所需的硬币最小数量为dp[i]
// dp[i] = min(dp[i-j], j is the value of coins) + 1
// dp[0] = 0

猜你喜欢

转载自www.cnblogs.com/arcpii/p/12533838.html
今日推荐