限制部件的数量和大小-在C++中[已关闭]

ssgvzors  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(129)

已关闭。此问题需要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;
}
kpbwa7wx

kpbwa7wx1#

所以这是一个递归函数,用于生成m个元素的有限组合数,这些组合数最多为m,但这个函数的公式似乎不正确。
递归公式应为:

C(m, n, j) = C(m, n-1, j-1) + C(m, n-1, j-2) + ... + C(m, n-1, j-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,因为这些情况都是无效的。

#include <iostream>

int C(int m, int n, int j)
{
    if (n == 0 && j == 0)
    {
        return 1;
    }
    if (n < 0 || j < 0)
    {
        return 0;
    }

    int sum = 0;
    for (int i = j; i >= j - m + 1; --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;
}

应包括对j〉(m-1)*n的检查:

int C(int m, int n, int j)
{
    if (n == 0 && j == 0)
    {
        return 1;
    }
    if (n < 0 || j < 0 || j > (m - 1) * n)
    {
        return 0;
    }

    int sum = 0;
    for (int i = j; i >= j - m + 1; --i)
    {
        sum += C(m, n - 1, i);
    }
    return sum;
}

相关问题