CS50 第一节课作业:贪婪算法

CS50 第一节课作业:找零算法

在 CS50 课程的第一节课中,我们被要求实现一个用最少硬币数进行找零的算法。该算法需要处理不同面值的硬币,并且保证返回的硬币数是最少的。

项目背景

在日常生活中,找零是一个非常常见的问题。在美国,通常的硬币面值有25美分(quarters)、10美分(dimes)、5美分(nickels)和1美分(pennies)。我们的目标是编写一个程序,给定一个金额,计算出使用最少数量硬币能够找零的方案。

示例

假设输入的金额是 41 美分,最优解应该是:

  • 1 个 25 美分硬币
  • 1 个 10 美分硬币
  • 1 个 5 美分硬币
  • 1 个 1 美分硬币

总共 4 个硬币。

算法设计

我们通过贪婪算法来解决这个问题。这个算法的核心思想是每一步都选择当前可以使用的最大面值硬币,然后减去该面值的硬币值,直到找零金额为 0。这个方法能够保证使用的硬币数量是最少的。

代码实现

下面是我们实现该算法的 C 语言代码:

#include <cs50.h>
#include <stdio.h>

int calculate_coins(int n);

int main(void)
{
    int n;
    int frequency;
    do
    {
        n = get_int("请输入需要找零的金额:");
    }
    while (n < 0);

    frequency = calculate_coins(n);

    printf("%i\n", frequency);
}

int calculate_coins(int n)
{
    int num = 0;

    num += n / 25;     // 使用25美分硬币的个数
    n %= 25;           // 剩余需要找零的金额

    num += n / 10;     // 使用10美分硬币的个数
    n %= 10;           // 剩余需要找零的金额

    num += n / 5;      // 使用5美分硬币的个数
    n %= 5;            // 剩余需要找零的金额

    num += n;          // 剩余部分全用1美分硬币

    return num;
}

关键步骤解析

  1. 输入验证:程序会要求输入一个非负整数作为需要找零的金额。如果输入负值,会要求重新输入,直到输入正确为止。
  2. 贪婪算法计算
    • 首先计算能够使用的25美分硬币的数量,并更新剩余找零的金额;
    • 然后计算能够使用的10美分硬币的数量,并再次更新剩余找零的金额;
    • 接着计算5美分硬币的数量;
    • 最后,所有剩余的金额都用1美分硬币完成找零。
  3. 输出结果:程序最终输出使用的最少硬币数。

结论

通过这次作业,我们熟悉了用贪婪算法解决实际问题的方法。在编码过程中,确保代码的简洁性和高效性也是一个重要的学习点。同学们可以尝试不同的输入值,来测试和熟悉这个找零算法的行为。

希望这篇博客能够帮助你更好地理解和实现 CS50 第一节课的作业。如果有任何问题,欢迎交流和讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值