分析问题
首先,我们需要清楚地理解题目要求:
1.文具种类与价格:
- 圆珠笔:8 角钱一支
- 铅笔:2 角钱一支
- 铅笔芯:1 角钱一支
2.购买要求:
- 每样至少买一支即圆珠笔、铅笔、铅笔芯的数量都 ≥ 1
- 总数要超过 30 支即圆珠笔 + 铅笔 + 铅笔芯 > 30
- 钱要全部花完即总花费 =N 元
3.单位统一:
- 题目中N 的单位是元,而文具价格是角。为了方便计算,我们将N 元转换为10N 角。
建立模型
我们需要找到满足以下条件的非负整数解设圆珠笔数量为x,铅笔为y,铅笔芯为z:
- x >=1, y >= 1 , z>=1
- x + y + z > 30
- 8x + 2y + z = 10N
- 为了简化问题,我们可以:
- 遍历所有可能的 x 和 y,然后计算 z
- 检查 z 是否满足 z >=1 和 x + y + z > 30
编写 C++ 代码
以下是基于上述思路的 C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
cin >> N;
int totalMoney = 10 * N; // 转换为角
int count = 0;
for (int x = 1; 8 * x <= totalMoney - 3; x++) { // x至少1支,且剩余的钱至少能买1支铅笔和1支铅笔芯
for (int y = 1; 8 * x + 2 * y <= totalMoney - 1; y++) { // y至少1支,且剩余的钱至少能买1支铅笔芯
int z = totalMoney - 8 * x - 2 * y;
if (z >= 1 && x + y + z > 30) {
count++;
}
}
}
cout << count << endl;
return 0;
}
代码解释
1.输入处理:
- 读取整数N,表示元数。
- 将N 元转换为10N 角,存入
totalMoney。
2.遍历所有可能的x 和y:
- x 从 1 开始,直到8x 不超过
totalMoney - 3因为至少需要 2 角买铅笔和 1 角买铅笔芯 - y 从 1 开始,直到8x + 2y 不超过
totalMoney - 1因为至少需要 1 角买铅笔芯
3.计算z 并检查条件:
- z = totalMoney – 8x – 2y
- 检查z>= 1 且x + y + z > 30。如果满足,方案数
count加 1
4.输出结果:
- 打印符合条件的方案总数
count。