贪心算法,贪的就是局部最优解,首先,每一个大问题都包含着子问题的最优解,其次,每个子问题都适用贪心算法。它是自上向下的求解问题。
引例、找零钱
问题描述
金钱面额为100,50,20,10,5,2,1,0.5,0.2,0.1,共10种,求解输入一个待找零钱的总额,以上每种面额各需要几张
代码及分析
#include<stdio.h>
# define maxn 10
long parvalue[maxn]={10000,5000,2000,1000,500,200,100,50,20,10};
int num[maxn]={0};
int exchange(long n)
{
int i,j;
for(i=0;i<maxn;i++)
{
// if(n>parvalue[i])
// break;
while(n>0&&i<maxn)
{
if(n>=parvalue[i])
{
n-=parvalue[i];
num[i]++;
}
else if(n<10&&n>=5)
{
num[maxn-1]++;
break;
}
else i++;
}
}
return 0;
}
int main()
{
int i;
float m;
printf("请输入找零金额:");
scanf("%f",&m);
exchange((long)100*m);
printf("\n%.2f元钱的找零方式:\n",m);
for(i=0;i<maxn;i++)
{
if(num[i]>0)
printf("面额%.1f的:%d张\n",(float) parvalue[i]/100.0,num[i]);
}
return 0;
}
待解决
疑问:第10、11行的代码其实可以算是冗余的,因为while循环里就有判断n是否大于当前面值金额,而且蹊跷的是不把这里两行注掉,会出现输入三位数字时不输出的情况,很迷。