#include #include // 用于 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; }