贪心算法 找零钱问题 (C)语言

例:有币值分别为25分,10分,1分的硬币,需找零30分,怎样找零所需硬币数目最少?

#include <stdio.h>
//找硬币:对25,10,1分钱,找30分钱。
void js1(int,int,int,int);
void js2(int,int,int);
void js3(int,int);
void bdx (void);
int i1[3]={0,0,0};
int i2[2]={0,0};
int i3=0,f1,f2,f3;
int main (){
	int z,z2,z3;
	printf("请输入找钱金额:");
	scanf("%d",&z);
		printf("从大到小输入硬币金额(分):");
		scanf("%d%d%d",&f1,&f2,&f3);
		js1(z,f1,f2,f3);
		js2(z,f2,f3);
	    js3(z,f3);
		bdx();
		//printf("%d %d %d",i2[1],i2[2]);
} 
void js1(int z,int f1,int f2,int f3){
    //printf("%d %d %d %d %d\n",z,i[1],i[2],i[3],i[4]);
	if(z>=f1&&z>0){
		i1[0]++;
		z-=f1;
	    }else if(z>=f2&&z>0){
	    	  i1[1]++;
		      z-=f2;
	          }else if(z>=f3&&z>0){
	          	    i1[2]++;
		            z-=f3;
	                }
	if(z!=0){
		js1(z,f1,f2,f3);
	}
}
void js2(int z,int f2,int f3){
    
	if(z>=f2&&z>0){
		i2[0]++;
		z-=f2;
	    }else if(z>=f3&&z>0){
	    	  i2[1]++;
		      z-=f3;
	          }
	//printf("%d %d %d %d %d\n",z,i2[1],i2[2],f2,f3);
	if(z!=0){
		js2(z,f2,f3);
	}
}
void js3(int z,int f3){
    //printf("%d %d %d %d %d\n",z,i[1],i[2],i[3],i[4]);
	if(z>=f3&&z>0){
		i3++;
		z-=f3;
	}
	if(z!=0){
		js3(z,f3);
	}
}
void bdx(void){
	int a=i1[0]+i1[1]+i1[2];
	int b=i2[0]+i2[1];
	int c=i3;
	/*printf("%d %d %d\n",i1[1],i1[2],i1[3]);
	printf("%d %d\n",i2[0],i2[1]);
	printf("%d %d %d",a,b,c);*/
	if(a<b&&a<c){
		printf("%d分%d枚,%d分%d枚,%d分%d枚",f1,i1[0],f2,i1[1],f3,i1[2]);
	}
	if(b<a&&b<c){
		printf("%d分%d枚,%d分%d枚",f2,i2[0],f3,i2[1]);
	}
	if(c<=b&&c<=a){
		printf("%d分%d枚",f3,i3);
	}
}

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值