五、贪心


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

引例、找零钱

问题描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值