MS在f2f采访时的采访提问:
确定
的整数解的个数 x1 + x2 + x3 + x4 + x5 = N
其中0 <= xi <= N
所以基本上我们需要在最多5个部分找到N的分区数 假设用纸和笔来解决。虽然没有取得多大进展,但有人有解决方案吗?
答案 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)
查找“重复组合”部分:具体情况在该部分下面用图解说明。(图片值得多说几句!)
答案 3 :(得分:2)
答案 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)
。