天天看點

買書問題

問題:

某書店對《哈利波特》做促銷活動,一共有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);  
}      

運作截圖:

買書問題