#include<stdio.h>
#include<stdlib.h>
int Min_coin(int coin[],int len,int M)
{//解题思路:先判断是否存在解,然后寻找从零到M的子问题最优解
int* Temp_dp = (int*)malloc(sizeof(int)*(M+1));
if (Temp_dp == NULL)
return -2;
Temp_dp[0] = 0;
for (int i=1;i<M+1;i++)
{
Temp_dp[i] = -1;
for (int j=0;j<len;j++)
{
if (coin[j] <= i && Temp_dp[i - coin[j]] != -1)//判断是否存在零钱金额中不大于要找零钱的情况如果存在表明可能存在解,再次判断从当前零钱金额中找零剩余的部分是否存在解(寻找子问题的解)如果有就说明一定有解
{
if (Temp_dp[i] == -1 || Temp_dp[i] > Temp_dp[i - coin[j]])//从遍历每一个解中寻找最优解
{
Temp_dp[i] = Temp_dp[i - coin[j]] + 1;
}
}
}
}
int result = Temp_dp[M];
free(Temp_dp);
return result;
}
int main()
{
int coin[] = { 1,2,5,10,20,50,100 };
printf("%d\n",Min_coin(coin,sizeof(coin)/sizeof(int),4));
return 0;
}
找零钱问题
于 2024-05-01 22:46:56 首次发布
本文详细介绍了如何使用C语言实现一个名为`Min_coin`的函数,通过动态规划方法解决给定零钱数组和最大找零金额的情况下,找到最少的硬币数量。函数`Min_coin`通过递归和子问题优化来找到最优解。
摘要由CSDN通过智能技术生成