在N容器中分配M个对象

时间:2014-09-14 12:05:57

标签: c++ math permutation

给定一个N size数组,其元素表示容器的容量......在多少种方式中可以分配M个相似的对象,以便最后填充每个容器。 例如

for arr={2,1,2,1} N=4 and M=10 there comes out be 35 ways.

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

首先计算容器大小的总和。我的情况2 + 1 + 2 + 1 = 6让它为P.找到从M中选择P对象的方式的数量。第一个对象有M个选择,第二个对象有M-1,M-2用于第三次等。这给出了使用M *(M-1)* ......(M-p + 1)或M! /(M-P)!这将为我们提供比你想要的更多的状态

1 2 | 3 | 4 5 | 6
2 1 | 3 | 4 5 | 6

有q!在q时隙中排列q对象的方法,所以我们需要除以阶乘(arr [0])和阶乘(arr [1])等。在这种情况下,除以2! * 1! * 2! * 1! = 4。

我得到的数字远远超过35。10! / 4! = 151200除以4给出37800,所以我不确定我是否正确理解了你的问题。


啊所以看看这个问题你需要找到N个整数n1,n2,...,nN,这样n1 + n2 + ... + nN = M和n1> = arr [1],n2> = arr [ 2]。

看起来很简单,让P如上所述。拿第一批P丸,给学生最小数量,arr [1],arr [2]等。你会留下M-P药丸,让它成为R。

本质上,问题简化为找到N数> = 0,其总和为R.这是一个经典问题。作为挑战,我不会为你做出答案,但如果我们打破N = 4,R = 4回答你可能会看到模式

4 0 0 0        - 1 case starting with 4
3 1 0 0        - 3 cases starting with 3
3 0 1 0
3 0 0 1
2 2 0 0        - 6 cases
2 1 1 0
2 1 0 1
2 0 2 0
2 0 1 1
2 0 0 2

1 3 0 0       -  10 cases
1 2 1 0
1 2 0 1
1 1 2 0
1 1 1 1
1 1 0 2
1 0 3 0          
1 0 2 1
1 0 1 2
1 0 0 3

0 4 0 0       - 15 cases
0 3 1 0
0 3 0 1
0 2 2 0
0 2 1 1
0 2 0 2
0 1 3 0
0 1 2 1
0 1 1 2
0 1 0 3
0 0 4 0
0 0 3 1
0 0 2 2
0 0 1 3
0 0 0 4

您应该识别数字1,3,6,10,15。