- gf24240 的博客
《梦溪笔谈·C++》卷二十七:[GESP202303 二级] 百鸡问题
- 2025-6-24 13:34:25 @
背景
百钱买百鸡
来源:洛谷
B3836 [GESP202303 二级] 百鸡问题
题目描述
“百鸡问题”是出自我国古代《张丘建算经》的著名数学问题。大意为:
“每只公鸡 元,每只母鸡 元,每 只小鸡 元;现在有 元,买了 只鸡,共有多少种方案?”
小明很喜欢这个故事,他决定对这个问题进行扩展,并使用编程解决:如果每只公鸡 元,每只母鸡 元,每 只小鸡 元;现在有 元,买了 只鸡,共有多少种方案?
输入格式
输入一行,包含五个整数,分别为问题描述中的 ,,,,。约定 ,。
输出格式
输出一行,包含一个整数 ,表示有 种方案。
输入输出样例 #1
输入 #1
5 3 3 100 100
输出 #1
4
输入输出样例 #2
输入 #2
1 1 1 100 100
输出 #2
5151
说明/提示
【样例 1 解释】
这就是问题描述中的“百鸡问题”。 种方案分别为:
- 公鸡 只、母鸡 只、小鸡 只。
- 公鸡 只、母鸡 只、小鸡 只。
- 公鸡 只、母鸡 只、小鸡 只。
- 公鸡 只、母鸡 只、小鸡 只。
题解
就是暴力枚举
#define jingitaimei 0
#include <iostream>
#define int long long
using namespace std;
int gong_jing_moy, mod_jing_moy, xiao_jing_moy, moy_buy_chk, num_buy_chk, way_buy_chk;
main()
{
scanf("%lld %lld %lld %lld %lld", &gong_jing_moy, &mod_jing_moy, &xiao_jing_moy, &moy_buy_chk, &num_buy_chk);
for (int gong_jing_num = 0; gong_jing_num <= num_buy_chk; ++gong_jing_num)
{
for (int mod_jing_num = 0; mod_jing_num <= num_buy_chk - gong_jing_num; ++mod_jing_num)
{
int xiao_jing_num = num_buy_chk - gong_jing_num - mod_jing_num;
if (xiao_jing_num % xiao_jing_moy != 0)continue;
int wen_jing = gong_jing_num * gong_jing_moy + mod_jing_num * mod_jing_moy + xiao_jing_num / xiao_jing_moy;
if (wen_jing != moy_buy_chk)continue;
++way_buy_chk;
}
}
printf("%lld", way_buy_chk);
return jingitaimei;
}
某题的状态转移方程:
$$dp[i] = \begin{cases} 0 & 0 \\ 1 & 0 \\ 2 & a[1] + a[2] \\ i & \max(dp[i-1],dp[i-3]+a[i-1]+a[i]) \end{cases} $$