本文最后更新于192 天前,其中的信息可能已经过时,如有错误请发送邮件到1729915388@qq.com
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
#include<stdio.h>
#define N 20
#define M 200
int min_fun(int a, int b)
{
int c = a<b?a:b;
return c;
}
int coinChange(int* coins, int coinsSize, int amount){
//1、确定状态
int f[amount+1];
//初始化
f[0] = 0;
//计算顺序 从小到大 i表示需要凑的总数
for(int i = 1;i<=amount;i++)
{
f[i] =M;
for(int j = 0;j<coinsSize;j++)
{
//3.边界情况 f[i-coins[j]]!=INT_MAX 表示凑不出硬币时,而且INT_MAX相加可能还会溢出
if(i>=coins[j] && f[i-coins[j]]!=M)
{
//2、转移方程
f[i] = min_fun(f[i],f[i-coins[j]]+1);
}
}
}
//当凑不出时,f[amount]仍然为INT_MAX,我们需要赋值为-1,最后返回f[amount]
if(f[amount] == M)f[amount] = -1;
return f[amount];
}
int main(){
int n,amount;
scanf("%d",&n);
int coins[N];
for(int i=0;i<n;i++)
scanf("%d",&coins[i]);
scanf("%d",&amount);
int r = coinChange(coins,n,amount);
printf("%d",r);
return 0;
}