买书问题

问题:

某书店对《哈利波特》做促销活动,一共有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);  
}

运行截图:

posted @ 2015-04-16 20:04  花总总  阅读(159)  评论(0编辑  收藏  举报