背景

百钱买百鸡

来源:洛谷


B3836 [GESP202303 二级] 百鸡问题

题目描述

“百鸡问题”是出自我国古代《张丘建算经》的著名数学问题。大意为:

“每只公鸡 55 元,每只母鸡 33 元,每 33 只小鸡 11 元;现在有 100100 元,买了 100100 只鸡,共有多少种方案?”

小明很喜欢这个故事,他决定对这个问题进行扩展,并使用编程解决:如果每只公鸡 xx 元,每只母鸡 yy 元,每 zz 只小鸡 11 元;现在有 nn 元,买了 mm 只鸡,共有多少种方案?

输入格式

输入一行,包含五个整数,分别为问题描述中的 xxyyzznnmm。约定 1x,y,z101 \le x,y,z \le 101n,m10001 \le n,m \le 1000

输出格式

输出一行,包含一个整数 CC,表示有 CC 种方案。

输入输出样例 #1

输入 #1

5 3 3 100 100

输出 #1

4

输入输出样例 #2

输入 #2

1 1 1 100 100

输出 #2

5151

说明/提示

【样例 1 解释】

这就是问题描述中的“百鸡问题”。44 种方案分别为:

  • 公鸡 00 只、母鸡 2525 只、小鸡 7575 只。
  • 公鸡 44 只、母鸡 1818 只、小鸡 7878 只。
  • 公鸡 88 只、母鸡 1111 只、小鸡 8181 只。
  • 公鸡 1212 只、母鸡 44 只、小鸡 8484 只。

题解

就是暴力枚举

#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} $$