换零钱的方法


现有面值分别为 1分, 5分, 10分, 25分, 50分 的五种硬币, 问一枚一块钱的硬币换成这几种硬币有几种换法。

先要明确一个事实, 总的换法一定等于 使用某一种硬币的换法和不使用某一种硬币的换法之和。

前者需要先将总数减去一定使用的那种硬币的面值, 再来讨论剩下的兑换方法。

后者需要先将硬币的种类减一, 再来讨论剩下硬币的兑换方法。

而归约的最终结果无非三种:

硬币总数为 0, 则返回一种方案。

硬币总数小于 0, 则返回 0 种方案。

硬币种类为0, 则返回 0 种方案。

schme 实现:

(define (count-change amount)
  (cc amount 5))

(define (cc amount kinds-of-coins)
  (cond ((= amount 0) 1)
           ((or (< amount 0) (< kinds-of-coins 1)) 0)
           (else (+ (cc amount
                           (- kinds-of-coins 1))
                       (cc (- amount 
                                (first-denomination kinds-of-coins))
                                kinds-of-coins)))))

(define (first-denomination kinds-of-coins)
  (cond ((= kinds-of-coins 1) 1)
           ((= kinds-of-coins 2) 5)
           ((= kinds-of-coins 3) 10)
           ((= kinds-of-coins 4) 25)
           ((= kinds-of-coins 5) 50)))

(count-change 100)

C++ 实现:

#include <iostream>

using namespace std;

int FirstDenomination (const int &kinds_of_coins)
{
    switch (kinds_of_coins) {
    case 1: return 1;
    case 2: return 5;
    case 3: return 10;
    case 4: return 25;
    default: return 50;
    }
}

int CountChange (const int &amount
                 , const int &kinds_of_coins)
{
    if (amount == 0) {
        return 1;
    }
    else if (amount < 0 || kinds_of_coins < 1) {
        return 0;
    }
    else {
        auto rest_kinds_of_coins = kinds_of_coins - 1;
        auto rest_amount = 
            amount - FirstDenomination (kinds_of_coins);
        return ( CountChange(amount
                             , rest_kinds_of_coins)
               + CountChange(rest_amount
                             , kinds_of_coins));
    }
}

int WaysToChange (const int &amount)
{
    return move(CountChange (amount, 5));
}

int main ()
{
    cout << move(WaysToChange (100));
    cout << endl;
    return 0;
}

优质内容筛选与推荐>>
1、ASP.NET MVC 入门5、View与ViewData
2、Dwing吧,讨论编解码系统应用
3、阿诺
4、OpenCV3计算机视觉Python语言实现笔记(四)
5、Linux入门——vsftpd


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn