分析问题
我们需要将一元(100 分)兑换为 1 分、2 分和 5 分的硬币,且每种硬币至少一枚。目标是计算所有可能的兑换方式数目。
约束条件:
- 总金额为 100 分: 1x + 2y + 5z = 100 。
- x , y ,z > 1
关键思路:
- 遍历可能的 5 分硬币数量 z 。
- 对于每个 z ,计算剩余金额 s = 100 – 5z 。
- 剩余金额由 1 分和 2 分硬币组合,需满足 x > 1 且 y >1 ,即 x + 2y = s 。
建立模型(伪代码)
- 初始化计数器
count = 0。 - 遍历 z 从 1 到 19(因为 5z < 95 。
- 对每个 z ,计算剩余金额 s = 100 – 5z 。
- 若 s < 3 ,跳过 无法满足 x>=1 和 y >=1;
- 否则,计算满足 x + 2y = s 的解的数目:
- y = (s -x) /2;
- x最小等于1, y 最大值为y = (s-1)/2;
- 累加解的数目到
count。 - 输出
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;
}
代码解释
- 遍历 5 分硬币数量 z :从 1 到 19(确保剩余金额至少为 3 分)。
- 计算剩余金额 s
= 100 - 5 * z。 - 跳过无效情况:若
s < 3,,跳过 无法满足 x>=1 和 y >=1; - 计算解的数目: y 的最大值为 y = (s-1)/2
- 输出结果:所有满足条件的兑换方式总数。
此代码通过遍历可能的 5 分硬币数量,快速计算所有合法组合数目,最终输出正确答案 461。