我一直试图找到这个问题的解决方案几个小时了:我有 L 球和 n 篮子标记为X1,X2,...... Xn,每个容器可以容纳 LXn 球。现在我想计算一下我将这些 L 球分配到篮子中的方式。
示例:
有3个篮子X1,X2和X3,X1和X3的容量是 2个球,X2的容量 3个球。现在 5球分配到这些篮子中:
X1 X2 X3
0 3 2
1 2 2
1 3 1
2 1 2
2 2 1
2 3 0
我想知道有多少种方法可以用给定的值分配球。
数学解决方案:
p_n(x)= x ^ 0 + x ^ 1 + .. + x ^(LXn)
P(x)= p_1(x)* ... * p_N(x)
关键是 x ^ L 之前的系数(见下一个等式)表示将给定的 L 球分配到 n <的方法的数量/ em>篮子。
通过上面的例子,这将导致
P(x)=(1 + x + x ^ 2)*(1 + x + x ^ 2 + x ^ 3)*(1 + x + x ^ 2)= 1 + 3x + 6x ^ 2 + 8x ^ 3 + 8x ^ 4 + 6x ^ 5 + 3x ^ 6 + x ^ 7
因此,对于 L = 5 ,它会读取 6种不同的排列
(来源:http://narkive.com/9a0CvErb.2(德语))
现在我的实际问题是:在java中有没有办法做到这一点,或类似的东西?
谢谢!
答案 0 :(得分:0)
创建多项式的方法&#34;在链接中解释为每个篮子创建一个多项式并将它们相乘。
您可以将多项式表示为系数向量,以便p[i]
是度i
项的系数。容量为n
的篮子的多项式是长度为n + 1
的多项式,所有系数都等于1.
你需要一种乘法多项式的方法,你可以在两个多项式项的两个嵌套循环中实现成对乘法和加法。
最后,m
球所需的数字是结果多项式的p[m]
。
这是一个快速的Java实现。 (免责声明:我对Java并不擅长。这段代码在一个在线编译器中编译和运行,但可能不是Java风格。)
import java.util.*;
public class Main
{
static int[] basket(int n)
{
int[] p = new int[++n];
while (n-- > 0) p[n] = 1;
return p;
}
static int[] mult(int[] p, int[] q)
{
int[] r = new int[p.length + q.length - 1];
for (int i = 0; i < p.length; ++i) {
for(int j = 0; j < q.length; ++j) {
r[i + j] += p[i] * q[j];
}
}
return r;
}
public static void main(String[] args)
{
int[] res = basket(0);
res = mult(res, basket(2));
res = mult(res, basket(3));
res = mult(res, basket(2));
System.out.println(res[5]);
}
}
此片段实现了将5个球分配到大小为2,3和2的篮子中的示例。起始多项式basket(0)
只是常数1,是多项式乘法的中性元素。