整体解决方案的数量

时间:2012-08-07 12:28:30

标签: algorithm combinations

MS在f2f采访时的采访提问:

确定

的整数解的个数

x1 + x2 + x3 + x4 + x5 = N

其中0 <= xi <= N

所以基本上我们需要在最多5个部分找到N的分区数 假设用纸和笔来解决。虽然没有取得多大进展,但有人有解决方案吗?

5 个答案:

答案 0 :(得分:3)

假设数字严格> 0
考虑整数段 [0,N] 。问题是将其分成正长度的 4 段。想象一下,我们通过在相邻数字之间放置4个分离点来做到这一点。有多少种方法可以做到这一点? C(N-1,4)
现在,一些数字可以是0-s。设 k 为非零数字。对于每个具有 C(N-1,k)分割的方式,我们可以用 C(5,k)方式选择它们。累计 [0,5] 范围内的所有 k ,我们得到了 Sum [C(5,k)* C(n-1,k); k = 0到5]

答案 1 :(得分:2)

@Grigor Gevorgyan确实提供了找出解决方案的正确方法。

考虑什么时候

1 <= xi

将N点分为5段。它相当于在N-1个可能的位置(相邻数字之间)插入4个“分离点”。所以答案是C(N-1,4)

然后呢

0 <= xi

如果你有<+ p>的X + 5点解决方案

1 <= xi

答案为C(N-1,4)=C(X+5-1,4)=C(X+4,4)

然后你只需从每一组中删除一个点,你就可以得到X点的解决方案,

0 <= xi

这意味着,现在的答案完全等于C(X+4,4)

答案 2 :(得分:2)

Topcoder tutorials

查找“重复组合”部分:具体情况在该部分下面用图解说明。(图片值得多说几句!)

答案 3 :(得分:2)

您的答案为here

这是经典问题 -

将N个球放入M个框中的选项数= c(M + N-1,N)。

答案 4 :(得分:1)

如果要求使用笔和纸溶液,则组合解决方案更合适。这也是经典的解决方案。这是一个动态编程解决方案。

dp[i, N] = number of solutions of x1 + x2 + ... +xi = N

我们来看x1 + x2 = N

我们有解决方案:

0 + N = N
1 + N - 1 = N
...
N + 0 = N

所以dp[2, N] = N + 1解决方案。

我们来看x1 + x2 + x3 = N

我们有解决方案:

0 + (0 + N) = N
0 + (1 + N - 1) = N
...
0 + (N + 0) = N
...

请注意,到目前为止有N + 1个解决方案。继续:

1 + (0 + N - 1) = N
1 + (1 + N - 2) = N
...
1 + (N - 1 + 0) = N
...

请注意,还有其他N解决方案。继续:

...
N - 1 + (0 + 1) = N
N - 1 + (1 + 0) = N
=> +2 solutions
N + (0 + 0) = N
=> +1 solution

所以我们有dp[3, N] = dp[2, N] + dp[2, N - 1] + dp[2, N - 2] + ... + dp[2, 0]

另请注意dp[k, 0] = 1

因为对于矩阵的每一行,我们需要N个求和,计算dp[k, N]的复杂度为O(k*N),这与组合学解决方案所需的一样多。< / p>

为了保持每行O(N)的复杂性,请存储s[i] = sum of the first i elements on the previous row。使用的内存也可以减少到O(N)