“人民幣找零”問題的貪婪法解決演算法

gudesheng發表於2008-01-03
/*
    標題:<<系統設計師>>應試程式設計例項-[遞推演算法程式設計]
    作者:成曉旭
    時間:2002年09月14日(18:20:00-20:18:00)
          實現“裝箱”問題的貪婪演算法實現函式
    時間:2002年09月14日(22:00:00-23:18:00)
          實現“裝箱”問題的貪婪演算法實現函式
    時間:2002年09月14日(18:20:38-22:18:00)
          實現“人民幣找零”問題的貪婪法解決演算法
*/

#include    
"stdio.h"
#include    
"stdlib.h"

//:============================“人民幣找零”問題的貪婪法解決演算法===========================
/*
    作者:成曉旭
    時間:2002年09月17日(21:28:38-22:18:00)
          完成“人民幣找零”問題的貪婪法解決演算法
    ===================================================
    問題描述:
        任何一張面額的紙幣都找成比它的面額小的紙幣,最小單位是元

    程式設計思想:
        已知,中華人民共和國的紙幣面額分別為:100元、50元、20元、10元、5元、2元、1元,
    任何一張較大面額的紙幣,都採用貪婪法首先分解成儘可能大的面額的紙幣。比如50元的紙幣
    找零時,首先分解出一個20元,接著在剩餘的30元中,再分解出一個20元,剩餘部分的10元,
    可以用一張10元的紙幣來找補。因此,分解結果是:50元 = 20元 + 20元 + 10元。
*/

#define        N    20
//找補零錢函式
//    int        money:            將被找零的面額
//    int        number:            當前面額money要求被找補的最大允許張數
//    int        subscript:        面額陣列下標
//    int        *denomination:    紙幣面額陣列
//    int        *param:            當前面額money在被要求找補的最大允許張數範圍內,貪婪法解決方案結果
int        Give_Change(int money,int number,int subscript,int *denomination,int *param)
{
    
int    result;
    
if(money == 0)                    return(0);        //已經分解完成
    if(number == 0 || subscript == 0)    return(-1);        //不可能分解
    if(money < *denomination)        return(Give_Change(money,number,subscript - 1,denomination + 1,param));
    
else
    
{
        
*param = *denomination;        //按能找零的最大面額給
        
//繼續對剩餘金額部分作分解
        result = Give_Change(money - *denomination,number - 1,subscript,denomination,param + 1);
        
if(result >= 0)            return(result + 1);
        
return(-1);        //不可能分解
    }

}

void    Run_Give_Change()
{
    
int money,number,k,i,dibs[N];
    
int    denomination[7= {100,50,20,10,5,2,1};
    printf(
"輸入整錢數、找零的最大張數money,number: ");
    scanf(
"%d%d",&money,&number);
    
for(i = 0;i < 7;i++)
        
if(money > denomination[i])
            
break;    //跳過面額比它在或相等的紙幣單位
    k = Give_Change(money,number,7 - i,&denomination[i],dibs);
    
if(k <= 0)
        printf(
"面額為[%d]元紙幣想找零成[%d]張零鈔,是找不開! ",money,number);
    
else
    
{
        printf(
"%d = %d",money,dibs[0]);
        
for(i = 1;i < k;i++)
            printf(
" + %d",dibs[i]);
        printf(
" ");
    }

}

//:============================“人民幣找零”問題的貪婪法解決演算法===========================

int main(int argc, char* argv[])
{
    
//Encase_Box();
    
//Journey_Horse();
    Run_Give_Change();
    printf(
" 應用程式執行結束! ");
    
return 0;
}



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935835


相關文章