B3836 [GESP202303 二级] 百鸡问题
题目描述
“百鸡问题”是出自我国古代《张丘建算经》的著名数学问题。大意为:
“每只公鸡 5 元,每只母鸡 3 元,每 3 只小鸡 1 元;现在有 100 元,买了 100 只鸡,共有多少种方案?”
小明很喜欢这个故事,他决定对这个问题进行扩展,并使用编程解决:如果每只公鸡 x 元,每只母鸡 y 元,每 z 只小鸡 1 元;现在有 n 元,买了 m 只鸡,共有多少种方案?
输入格式
输入一行,包含五个整数,分别为问题描述中的 x,y,z,n,m。约定 1≤x,y,z≤10,1≤n,m≤1000。
输出格式
输出一行,包含一个整数 C,表示有 C 种方案。
输入输出样例 #1
输入 #1
5 3 3 100 100
输出 #1
4
输入输出样例 #2
输入 #2
1 1 1 100 100
输出 #2
5151
说明/提示
【样例 1 解释】
这就是问题描述中的“百鸡问题”。4 种方案分别为:
- 公鸡 0 只、母鸡 25 只、小鸡 75 只。
- 公鸡 4 只、母鸡 18 只、小鸡 78 只。
- 公鸡 8 只、母鸡 11 只、小鸡 81 只。
- 公鸡 12 只、母鸡 4 只、小鸡 84 只。
因总数 m 是已知的,我们可以使用双重循环枚举每一种可能,最外层假设公鸡的数量为 i 只,从 0 枚举到 m ,对于每一个公鸡数量,内层循环假设母鸡的数量为 j 只(保证公鸡和母鸡总数不超过 m ),则小鸡的数量为 m−i−j,并确保它是 z 的整数倍。
检查方案是否有效:对于每一种公鸡、母鸡和小鸡的数量组合,检查它们的价格之和是否等于给定的总金额 n。如果满足条件,则用 ans 记录下这个购买方案。
遍历并验证所有可能的组合后,统计出满足条件的方案数量。
答案:
#include <iostream>
using namespace std;
int main() {
int x, y, z, n, m, cnt = 0;
cin >> x >> y >> z >> n >> m;
for (int gj = 0; gj * x <= n && gj <= m; gj++){
gj*y+gj*x;
for (int mj = 0; mj * y + gj * x <= n && mj + gj <= m; mj++) {
int xj = (n- gj * x- mj * y) * z;
if (gj + mj + xj == m)
cnt++;
}
}
cout << cnt << endl;
return 0;
}