Algorithm N个相同球在不同盒子中的组合 intf(intn,inta,intx) { 如果(a==1) { 如果(n>=0&&n

Algorithm N个相同球在不同盒子中的组合 intf(intn,inta,intx) { 如果(a==1) { 如果(n>=0&&n,algorithm,combinatorics,Algorithm,Combinatorics,你需要的是动态规划。你需要为那些已经计算过的参数记忆函数f的值。也可以不使用递归实现,如下所示: int f(int n,int a,int x) { if(a==1) { if(n>=0 && n<=x) //HERE WAS ERROR,sorry return 1; else return 0; }

你需要的是动态规划。你需要为那些已经计算过的参数记忆函数f的值。也可以不使用递归实现,如下所示:

int f(int n,int a,int x)
{
        if(a==1)
        {
            if(n>=0 && n<=x)  //HERE WAS ERROR,sorry
                return 1;
            else 
                return 0;
        }

        int ans=0;

        for(int i=0;i<=x;i++)
            ans += f(n-i,a-1,x);

    return ans;
}
int f(int n,int a,int x)
{
    int q[1000][50]; // to simplify and not use dynamic allocation assume that a < 50 and n < 1000

    q[0][0] = 1;
    for (int i = 1; i < 1000; ++i)
        q[i][0] = 0;

    for (int i = 1; i <= a; ++i)
    {
        for (int j = 0; j <= n; j++)
        {
            int t = 0;
            for (int l = 0; l <= j && l <= x; ++l)
                t += q[j - l][i-1];
            q[j][i] = t;
        }
    }

    return q[n][a];
}
intf(intn,inta,intx)
{
int q[1000][50];//为了简化而不使用动态分配,假设a<50,n<1000
q[0][0]=1;
对于(int i=1;i<1000;++i)
q[i][0]=0;

对于(int i=1;i首先,如果
A*X
,则无法分配球,因此您可以提前停止。如果
A*X==N
,则只有一种方法。然后,首先选择放置
X
球的框数并以较小的限制重复,可能会更快

int f(int n,int a,int x)
{
    int q[1000][2]; // to simplify and not use dynamic allocation assume n < 1000

    q[0][0] = 1;
    for (int i = 1; i < 1000; ++i)
        q[i][0] = 0;

    int current = 1;
    for (int i = 1; i <= a; ++i)
    {
        int t = 0;
        for (int j = 0; j <= n; j++)
        {
            t += q[j][1 - current];
            if (j > x)
                t -= q[j - x - 1][1 - current];

            q[j][current] = t;
        }
        current = 1 - current;
    }

    return q[n][1 - current];
}
intf(intn,inta,intx){//实际上都应该是无符号的
如果(n==0){
返回1;
}
int p=a*x;
if(p对于(xCalc= min;xCube < p>查看和页面底部的公式。

语言?可以是C99、C++、C*、java,还有什么?@ LePiPi:因为OP称之为算法,它必须是伪代码;@leppie我认为这并不重要——算法才是重要的。@LuVue:如果你的例子的答案是1,那么为什么你的函数返回9?哦,答案是动态规划。@leppie:没关系,我只是想知道算法……你不需要比[X+1]大的记忆数组同意。但这会使代码变得更复杂。我想2*n变体就足够用于技术解释了。如果你能添加带有x+1记忆的可理解样本,你是受欢迎的。你的意思是C[m+k-s(t,j)-1,m-1]?在底部你可以找到n(k)的公式,它是m项的交替和,其中m应该是框的数目(每个术语都是某些二项式系数的乘积)约翰·唐恩,我不明白这一点:(@LuVue底部只有一个公式。它是纯文本的,所以可能很难阅读。可能会有帮助。
int f(int n, int a, int x){   // should all be unsigned, actually
    if (n == 0){
        return 1;
    }
    int p = a*x;
    if (p < n){
        return 0;
    }
    if (p == n){
        return 1;
    }
    if (x == 1){
        return binom(a,n);    // ways to choose n boxes from a boxes
    }
    // now the interesting cases
    int ways = 0;    // should perhaps be unsigned long long, that number grows fast
    int xCount, tempRes, min, max;
    min = a+n-p;
    if (min < 0) min = 0;
    max = n/x;
    for(xCount = min; xCount <= max; ++xCount){
        tempRes = f(n - x*xCount,a - xCount, x-1); // ways to distribute the remaining balls
        ways += binom(a,xCount)*tempRes;    // multiply by the number of ways to choose xCount boxes
    }
    return ways;
}