已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
昨天关门了。
Improve this question
我正尝试从www.example.com网站重新构建以下“部件数量受限和部件大小受限”公式oeis.org:
它应该给予“合成n ≤ k ≤ m n到n个部分,部分的大小不大于m”。我循环通过代码,直到我得到一个0。
C_3(3,3)的期望结果为1,3,6,7,6,3,1(如网站上的表所示)。我得到的结果类似于1369121212
我就是看不出我的代码哪里错了。我已经看了两天了,还是不明白。
#include <iostream>
int C(int m, int n, int j)
{
if (n == 0 && j == 0)
{
return 1;
}
if (j < 0 || j > (m - 1) * n)
{
return 0;
}
int sum = 0;
for (int i = j - ((m - 1) * n); i <= j; ++i)
{
sum += C(m, n - 1, i);
}
return sum;
}
int main()
{
constexpr int m = 3;
constexpr int n = 3;
int counter = 0;
while (int result = C(m, n, counter++))
{
std::cout << result;
}
std::cin.ignore();
return 0;
}
1条答案
按热度按时间kpbwa7wx1#
所以这是一个递归函数,用于生成m个元素的有限组合数,这些组合数最多为m,但这个函数的公式似乎不正确。
递归公式应为:
对于给定的n值,m种元素组成至多m的n份尺寸的数量等于m-1种元素组成至多m的n-1份尺寸的数量,加上m-2种元素组成至多m的n-1份尺寸的数量,等等,直到0种元素组成至多m的n-1份尺寸的数量。
递归的基本情况是当n = 0且j = 0时,函数应该返回1(因为只有一种方法可以将0个元素组合成0个部分);如果n〈0或j〈0,函数应该返回0,因为这些情况都是无效的。
应包括对j〉(m-1)*n的检查: