2012-08-07

SCIP in C++11 ― 2.2.1節 その2


両替の計算その2:問題2.19

まるで魔法のようにうまくいっちゃんだなあ・・・。
勉強になる。
----
typedef List CoinList;

const CoinList exceptFirstDenomination
(const CoinList& coinValues)
{
    return(cdr(coinValues));
}
const double firstDenomination(const CoinList& coinValues)
{
    return(value<double>(car(coinValues)));
}
const bool isNoMore(const CoinList& coinValues)
{
    return(isNull(coinValues));
}


const int cc(const double amount, const CoinList& coinValues)
{
    if(0==amount){return(1);}
    else if(0>amount || isNoMore(coinValues)){return(0);}
    else{
        return(cc(amount,exceptFirstDenomination(coinValues))
               +cc(amount-firstDenomination(coinValues),coinValues));
    }
}

const int countChange(const double amount,const CoinList& coinValues)
{
    return(cc(amount,coinValues));
}
int main(int argc, char** argv)
{
    const auto usCoins(makeList(50.0,25.0,10.0,5.0,1.0));
    const auto ukCoins(makeList(100.0,50.0,20.0,10.0,5.0,2.0,1.0,0.5));
   
    cout<<"# of exchanges for 1$="<<countChange(100.0,usCoins)<<endl;
    cout<<"# of exchanges for 1pound="<<countChange(100.0,ukCoins)<<endl;

    return(0);
}
----
出力
----
# of exchanges for 1$=292
# of exchanges for 1pound=104561

0 件のコメント :

コメントを投稿