买书问题
问题:
某书店对《哈利波特》做促销活动,一共有5卷。假设每一卷的单独销售价格为8元,如果读者一次购买不同的两卷,就可以扣除5%的费用,三卷则更多,优惠如下:
对所有可能情况分析之:
可以由此看出规律 编写代码如下;
#include<stdio.h> int change[5] = {25,20,10,5,0}; //求数组中最大的值 //用于取出做大节约钱数 int max_index(int a[5]){ int max=0; int i; for(i=0;i<5;i++){ if(max < a[i]) max = a[i]; } return max; } //冒泡排序 //用于转化最小表示(1,2,2,2,2)->(2,2,2,2,1) void bubble(int *a,int n) { int i,j,temp; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(a[i]<a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } //递归函数 int func(int a[5]){ int i,j,k; int buf[5]; int cash[5]; for(i=0;i<5;i++){ cash[i] = 0; //buf[i] = a[i]; } //退出条件 if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]&&a[3]==a[4]&&a[4] == 0){ return 0; } //排序 转化最小表示 bubble(a,5); //5次循环 for(i=1;i<=5;i++){ if(a[5-i] >= 1){ for(k=0;k<5;k++){ buf[k] = a[k]; } //减一 for(j=0;j<=5-i;j++) buf[j] = buf[j]-1; //继续递归 cash[i-1] = (5-i+1)*8*change[i-1]+func(buf); } } //返回最大值 return max_index(cash); } int main(){ int b=0; int a[5] = {0,0,0,0,0}; printf("本程序假设每本书售价8元,请输入书本个数:"); scanf("%d",&b); for(int i=0;i<b;i++) { a[i%5]+=1; } float result =0; result = func(a); printf("共节约 %2.2f元!\n",result/100); }
运行截图: