#include <stdio.h>
#include <stdlib.h>
void FindMin(int money,int *coin,int n)
{
int *coinNum = (int*)malloc(sizeof(int)*(money+1));//存储1...money找零最少需要的硬币的个数
int *coinValue = (int*)malloc(sizeof(int)*(money+1));//最后加入的硬币,方便后面输出是哪几个硬币
coinNum[0]=0;
int i,j;
for(i=1;i<=money;i++)
{
int minNum=i;//i面值的钱,需要最少硬币个数
int usedMoney=0;//这次找零,在原来的基础上需要的硬币
for(j=0;j<n;j++)
{
if(i>=coin[j])//找零的钱大于这个硬币的面值
{
//if(coinNum[i-coin[j]]+1<=minNum)//所需硬币个数减少了
/*
上面的判断语句有问题,在更新时,需要判断i-coin[j]是否能找的开,如果找不开,
就不需要更新。多谢zywscq 指正
*/
//所需硬币个数减少了
if(coinNum[i-coin[j]]+1<=minNum&&(i==coin[j]||coinValue[i-coin[j]]!=0))
{
minNum=coinNum[i-coin[j]]+1;//更新
usedMoney=coin[j];//更新
}
}
}
coinNum[i]=minNum;
coinValue[i]=usedMoney;
}
//输出结果
if(coinValue[money]==0)
printf("NO");
else
{
printf("需要最少硬币个数为:",coinNum[money]);
printf("硬币分别为:");
while(money>0)
{
printf("%d ",coinValue[money]);
money-=coinValue[money];
}
}
free(coinNum);
free(coinValue);
}
int main()
{
int Money,n;scanf("%d%d",&Money,&n);
int i;
int coin[1024*10];
for(i=0;i<n;i++)
{
scanf("%d",&coin[i]);
}
FindMin(Money,coin,n);
return 0;
}
动态规划之最少硬币
最新推荐文章于 2022-02-01 10:46:08 发布