如果我们有不同的东西,我们需要在不同的人之间分配它们,那么我们可以采用多少种方式来实现这一目标,以便每个人都有以下条件: 1号人物至少可以拥有物品,最多可以拥有物品 人2至少可以拥有c物和最多物 ..等等?
e.g if n = 5 and m =3 and the conditions are:
person 1 can receive at least 0 and at most 1 gift
person 2 can receive at least 1 and at most 3 gift
person 3 can receive at least 1 and at most 4 gift
then the number of ways of distributing these 5 gifts is 6((0 1 4), (0 2 3), (0 3 2), (1 1 3), (1 2 2), (1 3 1)).
我认为,一种方法是迭代每个范围的所有可能组合,并查看哪些总和为n,但不能想到有效的算法。 感谢
答案 0 :(得分:3)
您可能希望使用生成函数方法。表示人i
获得x
指数的对象数量。这意味着,如果某个人i
至少可以拥有3
和最多7
件事,则这与
x^3 + x^4 + x^5 + x^6 + x^7
请记住将+
视为OR
,将*
视为AND
。如果我们想强加条件和人1
以及人2
,那么将它们的功能相乘。例如,人1
介于3
和7
之间,并说人2
至少有5
件事,并添加第三人大多数10
件事。然后我们得到:
(x^3 + x^4 + x^5 + x^6 + x^7) * (x^5 + x^6 + ... ) * (1 + x + x^2 + ... + x^10)
也可以写成
(x^3 + x^4 + x^5 + x^6 + x^7) * ( x^5/(1+x) ) * (1 + x + x^2 + ... + x^10)
从中获取信息的方法如下。这些术语扩展中x^M
的系数给出了在受到给定约束的所有人中分配总共M
个事物的方法的数量。
你可以从公式中解决这个问题,或编写一个程序来提取系数,但我们的想法是使用生成函数作为一种方便有效的方法来编码约束和答案。