解决方案的数量

时间:2013-09-01 17:41:25

标签: algorithm dynamic-programming combinatorics multinomial

我遇到了问题,

  x1 + x2 + x3 +x4 +x5 + x6 < M

其中xi是正整数,M可以是[1,6000000]中的任何值。 有多少unordered solutions with distinct xi's存在。 我想知道这是否可以通过动态编程来完成(它在给定的约束和内存限制下快速运行),或者我必须提出一个组合式公式。
我必须报告answer modulo 1000000007
PS:我不想要解决方案

2 个答案:

答案 0 :(得分:2)

你不想要完整的解决方案,所以我不会把它给你;我会试着指出你正确的方向。

首先,您需要在更简单的问题中分解问题。在你的情况下,这就是诀窍:

|(x_1,...x6) : sum(x_i) < M | = sum( |(x_1,...,x6) : sum(x_i) = N|)

代表N=6,...,M-1。现在,您只需要不同的解决方案,因此您可以假设:

x_1 <= x_2 <= ... <= x_6

现在,计算一下k个元素总和为N的方式的数量并不难(首先尝试使用2个元素,而不是3个元素,然后尝试获取一般论坛,并且,如果你有一些时间在你的手上,通过归纳证明它,并且一旦你有了,你基本上完成了。

重要提示:因为现在应该很清楚,我认为组合方法比蛮力方法更好

答案 1 :(得分:0)

你可以去蛮力,只需创建一个矢量(或其他动态容器)来推送解决方案。这不会是内存问题。 但这将是漫长的过程。 另一个想法是创建一个fstream,并定期刷新(每10000个解决方案);