五、贪心

文章目录

  • 引例、找零钱
    • 问题描述
    • 代码及分析
          • 待解决

贪心算法,贪的就是局部最优解,首先,每一个大问题都包含着子问题的最优解,其次,每个子问题都适用贪心算法。它是自上向下的求解问题。

引例、找零钱

问题描述

金钱面额为100,50,20,10,5,2,1,0.5,0.2,0.1,共10种,求解输入一个待找零钱的总额,以上每种面额各需要几张

代码及分析

#include
# 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是否大于当前面值金额,而且蹊跷的是不把这里两行注掉,会出现输入三位数字时不输出的情况,很迷。

你可能感兴趣的:(算法管窥)