題目描述
給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1
示例 2:
輸入: coins = [2], amount = 3
輸出: -1
說明:
你可以認爲每種硬幣的數量是無限的。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/coin-change
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
白話題目:
有一定數量的Q,各種面值的,要組裝成目標的值,最少多少張。
算法:
動態規劃,看dp[i],金額i最少用多少張,
dp[i]和min(dp[i-coins[j]]+1)是一樣的,白話的將就是,你最終要拿的金額如何少拿一張,最優是啥?
詳細解釋關注 B站 【C語言全代碼】學渣帶你刷Leetcode 不走丟
C語言完全代碼
#include <stdio.h>
#include <stdlib.h>
int coinChange(int* coins, int coinsSize, int amount)
{
int i=0;
int dp[amount+1];
for(i=0; i<=amount; i++)
{
dp[i]=-1;
}
dp[0]=0;
int m,n;
for(m=1; m<=amount; m++)
{
for(n=0; n<coinsSize; n++)
{
if(m-coins[n]>=0&&dp[m-coins[n]]!=-1)
{
if(dp[m]==-1||dp[m]>dp[m-coins[n]]+1)
{
dp[m]=dp[m-coins[n]]+1; //最小的
}
}
}
}
return dp[amount];
}
int main()
{
int coinsSize;
int amount;
printf("請輸入錢的種類個數和目標值 3 11 \n");
scanf("%d %d",&coinsSize,&amount);
printf("請輸入數組,例1 2 5:");
int coins[coinsSize];
int i;
for(i=0; i<coinsSize; i++)
{
scanf("%d",&coins[i]);
}
int result=coinChange(coins, coinsSize, amount);
printf("%d",result);
return 0;
}