给定不同面额的硬币 coins 和一个总金额 amount。
设计DP算法,求解可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
假设,每种硬币的数量是无限的。
输入格式:
第1行输入:硬币的个数n和总金额amount
第2行输入:n个硬币的金额
输出格式:
输出:最少的硬币个数,如无解则输出-1
输入样例:
在这里给出一组输入。例如:
3 11
1 2 5
输出样例:
在这里给出相应的输出。例如:
3
#include <stdio.h>
int coinChange(int coin[], int n, int amount) {
int dp[amount + 1];
memset(dp, 0x3f3f3f3f, sizeof(dp));
dp[0] = 0;
for (int i = 1; i <= amount; ++i) {
for (int j = 0; j < n; ++j) {
if (coin[j] <= i) {
dp[i] = min(dp[i], dp[i - coin[j]] + 1);
}
}
}
return dp[amount] == 0x3f3f3f3f ? -1 : dp[amount];
}
int min(int a, int b) {
return a < b ? a : b;
}
int main() {
int n, amount;
scanf("%d %d", &n, &amount);
int coin[n];
for (int i = 0; i < n; ++i) {
scanf("%d", &coin[i]);
}
int result = coinChange(coin, n, amount);
printf("%d\n", result);
return 0;
}