學渣帶你刷Leetcode0322. 零錢兌換

題目描述

給定不同面額的硬幣 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;


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章