编辑代码

#include <stdio.h>
#include <limits.h>
#define MAX_AMOUNT 1000  // 最大金额
#define MAX_COINS 100  // 最大硬币种类

int min(int a, int b) {
    return a < b ? a : b;
}

int coin_collect(int coins[], int n, int amount) {
    int dp[MAX_AMOUNT+1];  // 动态规划数组,dp[i]表示凑出金额i所需的最少硬币个数
    int i, j;

    // 初始化动态规划数组
    for (i = 0; i <= amount; i++) {
        dp[i] = INT_MAX;
    }
    dp[0] = 0;

    // 填充动态规划数组
    for (i = 1; i <= amount; i++) {
        for (j = 0; j < n; j++) {
            if (coins[j] <= i) {
                dp[i] = min(dp[i], dp[i-coins[j]] + 1);
            }
        }
    }

    // 返回最终结果
    return dp[amount] == INT_MAX ? -1 : dp[amount];
}

int main() {
    int coins[MAX_COINS] = {1, 2, 5};  // 硬币面值数组
    int n = 3;  // 硬币种类数
    int amount = 11;  // 总金额
    int min_coins;

    min_coins = coin_collect(coins, n, amount);

    printf("凑出金额%d所需的最少硬币个数为%d\n", amount, min_coins);
    return 0;
}