兑换硬币

分析问题

我们需要将一元(100 分)兑换为 1 分、2 分和 5 分的硬币,且每种硬币至少一枚。目标是计算所有可能的兑换方式数目。

约束条件

  1. 总金额为 100 分: 1x + 2y + 5z = 100 。
  2. x , y ,z > 1

关键思路

  • 遍历可能的 5 分硬币数量 z 。
  • 对于每个 z ,计算剩余金额 s = 100 – 5z 。
  • 剩余金额由 1 分和 2 分硬币组合,需满足 x > 1 且 y >1 ,即 x + 2y = s 。

建立模型(伪代码)

  1. 初始化计数器 count = 0
  2. 遍历 z 从 1 到 19(因为 5z < 95 。
  3. 对每个 z ,计算剩余金额 s = 100 – 5z 。
  4. 若 s < 3 ,跳过 无法满足 x>=1 和 y >=1;
  5. 否则,计算满足 x + 2y = s 的解的数目:
  • y = (s -x) /2;
  • x最小等于1, y 最大值为y = (s-1)/2;
  1. 累加解的数目到 count
  2. 输出 count

编写 C++ 代码

#include <bits/stdc++.h>
using namespace std;
int main() 
{
    int count = 0;
    for (int z = 1; z <= 19; ++z) {//5分钱
        int s = 100 - 5 * z;//余
        if (s < 3) continue;
        int num = (s - 1) / 2; //剩下的可能性
        count += num;
    }
    cout << count << endl;
    return 0;
}

代码解释

  1. 遍历 5 分硬币数量 z :从 1 到 19(确保剩余金额至少为 3 分)。
  2. 计算剩余金额 s = 100 - 5 * z
  3. 跳过无效情况:若 s < 3,,跳过 无法满足 x>=1 和 y >=1;
  4. 计算解的数目: y 的最大值为 y = (s-1)/2
  5. 输出结果:所有满足条件的兑换方式总数。

此代码通过遍历可能的 5 分硬币数量,快速计算所有合法组合数目,最终输出正确答案 461