记录一下我唯一能看懂的一种解法:
dp 数组迭代解法
由于每一种面值的硬币数量不限,所以该问题时一个动态规划问题,解决思路是定义一个dp数组,其中dp[i]表示凑成金额i所需要的最少硬币数量。
若给定的面值数组为coins[1,2,5],需要的金额amount=11则可以将dp数组初始化为
0 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 | 12 |
---|
dp[0]=0是因为组成面值为0至少需要0个硬币数量,由于组成其他金额所需要的硬币数量最多不会超过amount的值(即全部用1元硬币凑),将初始值设置为amount+1方便迭代求出每一个金额所需要硬币的最小数量。
在求每一种金额所需的最小硬币数量dp[i]时,要利用前面所求的结果dp[0]~dp[i-1],例如已知组成10元所需的最少硬币数,且当前给定的面值里面有1元面值,则组成11元所需的最少硬币数=组成10元所需的最少硬币数+1。
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1,amount+1);
dp[0]=0;
for(int i=0;i<amount+1;i++)//0~amount
{
for(int coin:coins)
{
if(i-coin>=0)
dp[i]=min(dp[i],1+dp[i-coin]);
}
}
if(dp[amount]!=amount+1)
return dp[amount];
return -1;
}
};