7-6 换硬币

 

分数 20

全屏浏览题目

切换布局

作者 C课程组

单位 浙江大学

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:

输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:

要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

输入样例:

13

输出样例:

fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

我的答案:

分析过程:

我们的目标是找到将一个给定的零钱数额换成5分、2分和1分硬币的所有可能方法,其中每种硬币至少有一枚。

观察:

  1. 给定零钱x,最多的5分硬币数是x/5
  2. 因为每种硬币至少有一枚,所以我们可以首先从5分硬币开始,从1到x/5为其设置一个循环。
  3. 对于每个5分硬币的数量,我们再为2分硬币设置一个循环,从1到剩余钱数除以2。
  4. 最后,1分硬币的数量就是总钱数减去已经转换的5分和2分硬币的数量。

C语言:

#include <stdio.h>

int main() {
    int x, count = 0;
    scanf("%d", &x);

    for (int fen5 = 1; fen5 <= x / 5; fen5++) {
        for (int fen2 = 1; fen2 <= (x - fen5 * 5) / 2; fen2++) {
            int fen1 = x - fen5 * 5 - fen2 * 2;
            if (fen1 > 0) {
                printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", fen5, fen2, fen1, fen5 + fen2 + fen1);
                count++;
            }
        }
    }
    printf("count = %d\n", count);
    return 0;
}

C++:

#include <iostream>
using namespace std;

int main() {
    int x, count = 0;
    cin >> x;

    for (int fen5 = 1; fen5 <= x / 5; fen5++) {
        for (int fen2 = 1; fen2 <= (x - fen5 * 5) / 2; fen2++) {
            int fen1 = x - fen5 * 5 - fen2 * 2;
            if (fen1 > 0) {
                cout << "fen5:" << fen5 << ", fen2:" << fen2 << ", fen1:" << fen1 << ", total:" << fen5 + fen2 + fen1 << endl;
                count++;
            }
        }
    }
    cout << "count = " << count << endl;
    return 0;
}

解题过程:

  1. 读取数据:从输入中读取一个整数x

  2. 双重循环:使用两层循环分别遍历5分和2分硬币的可能数量。

  3. 计算1分硬币数量:基于当前的5分和2分硬币数量计算1分硬币的数量。

  4. 输出结果:按照指定格式输出结果。

  5. 计数:对满足条件的方案数量进行计数,并在最后输出总的方案数。

思考过程:

这道题目需要我们考虑不同种类硬币组合的可能性,并对其进行有效遍历。这是一个简单的组合问题,需要对循环和条件语句有深入的了解和应用。

解决这类问题通常需要经验和对问题本质的理解。以下是我的思考过程:

1. **问题理解**:首先,我需要确保我完全理解了题目的要求。题目要求给出所有可能的方法将一个给定数额换成3种硬币,其中每种硬币至少有一枚。

2. **简化问题**:在考虑所有三种硬币之前,我首先考虑了只有一种硬币的情况。例如,如果只考虑5分硬币,最多可以有多少枚?

3. **增加复杂性**:一旦我理解了如何处理一种硬币,我开始考虑第二种硬币,即2分硬币。这时,我意识到可以使用一个内循环来处理第二种硬币,同时考虑第一种硬币的数量。

4. **逻辑推导**:基于前两种硬币的数量,第三种硬币的数量可以直接计算出来。

5. **最小约束**:题目要求每种硬币至少有一枚,这为我们提供了循环的起始值。

6. **组合思维**:由于需要找出所有可能的组合,所以我决定使用嵌套循环来迭代每种可能的组合。

7. **实验与验证**:在构建解决方案的过程中,我也会在纸上尝试一些例子,以确保我的逻辑是正确的。例如,对于数额为13,我会手工计算可能的组合,然后与我的解决方案进行对比。

8. **优化**:虽然这个特定的问题可能没有太多的优化空间,但在解决问题后,我会考虑是否有更高效或简洁的方法来达到同样的结果。

总的来说,解决这种问题需要组合对问题的深入理解、先前的经验、逻辑推导和一些实验验证。很多时候,从简单的情况开始,然后逐渐增加复杂性是一种有效的策略。

总结:

这道题目涉及到了许多有用的概念和编程技巧,我们可以从中学到以下几点:

1. **组合思维**:题目要求我们找到所有可能的硬币组合,这需要我们探索并了解如何有效地遍历所有可能的组合。

2. **嵌套循环的使用**:为了找到所有可能的组合,我们需要使用多重循环。这是一个很好的练习,让我们更熟悉如何使用和控制嵌套循环。

3. **边界条件和约束**:题目中有一些重要的约束,例如每种硬币至少有一枚。处理这些约束是解题的关键,也教会我们如何在编程中考虑和处理边界条件。

4. **数学和逻辑推导**:计算出每种硬币的最大可能数量,以及基于前两种硬币的数量推导出第三种硬币的数量,都需要一定的数学和逻辑思维。

5. **优化思维**:虽然我们的方法是直接的,但这种题目可以引导我们思考是否存在更高效的方法,或者当约束改变时,解决方案如何适应。

6. **输出格式**:正如许多编程题,正确、精确地输出是非常重要的。这训练了我们的细节意识。

7. **问题分解**:在解决问题时,从简到难、逐步增加复杂性的方法往往很有用。这可以帮助我们将一个复杂问题分解为几个更简单、更易于管理的部分。

8. **实践与验证**:手动进行一些测试或在纸上验证解决方案的正确性是一个很好的习惯,可以确保我们的逻辑没有遗漏。

总体来说,这道题目提供了一个机会,不仅让我们练习基本的编程结构和技巧,而且让我们思考如何有效地遍历和处理组合。这对于许多算法和编程挑战都是核心的技能。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
假设需要x个1角硬币,y个5角硬币和z个1元硬币。 根据题目条件,我们可以列出以下方程组: x + 5y + 10z = 2000 (20人民币成20元) x + y + z = 50 (硬币总数为50枚) 其中,第一个方程是将20人民币成20元的转化,第二个方程是硬币总数为50枚的限制条件。 将第一个方程中的10除以5,可以得到: 2x + y + 2z = 400 (将第一个方程中的10成5) 现在我们有了两个方程,可以通过解方程组求解出x、y和z的值。 将第二个方程变形为: x = 50 - y - z 将x代入第一个方程,可以得到: 2(50 - y - z) + y + 2z = 400 化简后得到: y = 2z - 20 现在我们有了y和z之间的关系,可以将它们代入任意一个方程中,求出x的值。 代入第二个方程,可以得到: (50 - y - z) + y + z = 50 化简后得到: x = 20 - z 现在我们有了x和z之间的关系,可以将它们代入任意一个方程中,求出y的值。 代入第一个方程,可以得到: 2(20 - z) + y + 2z = 400 化简后得到: y = 360 - 4z 现在我们已经求出了x、y和z的值,分别为: x = 20 - z y = 360 - 4z z = 5, 6, 7, ..., 18, 19, 20 因为x、y和z都是非负整数,所以只有当z取5、7、8、10、11、13、14、16、17或19时才有解。 当z=5时,x=15,y=340,硬币总数为50,符合条件。 当z=7时,x=13,y=328,硬币总数为48,不符合条件。 当z=8时,x=12,y=316,硬币总数为48,不符合条件。 当z=10时,x=10,y=292,硬币总数为48,不符合条件。 当z=11时,x=9,y=280,硬币总数为50,符合条件。 当z=13时,x=7,y=256,硬币总数为50,符合条件。 当z=14时,x=6,y=244,硬币总数为50,符合条件。 当z=16时,x=4,y=220,硬币总数为50,符合条件。 当z=17时,x=3,y=208,硬币总数为48,不符合条件。 当z=19时,x=1,y=184,硬币总数为50,符合条件。 因此,符合条件的硬币数方案共有4种: 15个1角硬币,340个5角硬币,20个1元硬币 9个1角硬币,280个5角硬币,20个1元硬币 7个1角硬币,256个5角硬币,20个1元硬币 1个1角硬币,184个5角硬币,20个1元硬币

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值