题意
各种币值的硬币个数充足,如何使用最少的硬币凑出指定的钱
思路
这个题使用动态规划解题。当前的状态只与币值的种类有关,所以是线性动态规划
状态定义:
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