#include <stdio.h>
#include <limits.h> // 用于 INT_MAX

#define MAX_AMOUNT 100 // 定义最大金额

// 函数原型
int coinChange(int coins[], int numCoins, int amount);

int main() {
    int coins[] = {1, 2, 5};  // 硬币面额数组
    int amount = 29;          // 目标金额
    int numCoins = sizeof(coins) / sizeof(coins[0]); // 硬币数量

    int result = coinChange(coins, numCoins, amount);
    if (result != -1) {
        printf("组成金额 %d 所需的最少硬币数为: %d\n", amount, result);
    } else {
        printf("无法组成金额 %d。\n", amount);
    }

    return 0;
}

int coinChange(int coins[], int numCoins, int amount) {
    // 创建一个固定大小的数组来存储最少硬币数
    int dp[MAX_AMOUNT + 1];

    // 初始化 dp 数组
    for (int i = 0; i <= MAX_AMOUNT; i++) {
        dp[i] = INT_MAX; // 将每个值初始化为无穷大
    }
    dp[0] = 0; // 组成金额 0 所需的硬币数为 0

    // 填充 dp 数组
    for (int i = 1; i <= MAX_AMOUNT; i++) {
        for (int j = 0; j < numCoins; j++) {
            if (coins[j] <= i) {
                // 更新 dp[i] 的值
                if (dp[i - coins[j]] != INT_MAX) {
                    dp[i] = (dp[i] < dp[i - coins[j]] + 1) ? dp[i] : (dp[i - coins[j]] + 1);
                }
            }
        }
    }

    // 返回结果
    return (amount <= MAX_AMOUNT && dp[amount] != INT_MAX) ? dp[amount] : -1;
}
