您将获得 N 项目总数, P 组,您必须在其中划分N个项目。
条件是每组持有的项目数量的乘积应该是最大值
示例 N = 10且P = 3 您可以在 {3,4,3} 中划分10项,因为 3x3x4 = 36 最大可能的产品。
答案 0 :(得分:0)
您需要形成大约P
元素的N / P
组。但是,这并不总是可行的,因为N
可能无法被P
整除,就像你的例子一样。
因此最初形成floor(N / P)
个元素组。以您为例,您将成为:
floor(10 / 3) = 3
=> groups = {3, 3, 3}
现在,将N
的其余部分除以P
:
10 mod 3 = 1
这意味着您必须向您的论坛分发另外一件商品(一般情况下,您最多可以分发P - 1
个商品):
for i = 0 up to (N mod P) - 1:
groups[i]++
=> groups = {4, 3, 3} for your example
这也是一种有效的解决方案。
答案 1 :(得分:0)
为了好玩,我得出了一个证据,证明它在最优解决方案中要么所有数字= N / P,要么数字是地板(N / P)和天花板(N / P)的某种组合。证明有点长,但在离散的背景下证明最优性很少是微不足道的。如果有人可以缩短证明,我会感兴趣。
引理:对于P = 2,如果N是偶数,则除N的最佳方式是{N / 2,N / 2},如果N是奇数,则{floor(N / 2),ceiling(N / 2)}
这是因为两个数和为N的约束意味着这两个数是x,N-x的形式。
所得产物是(N-x)x = Nx-x ^ 2。这是一个抛开的抛物线。它的最大值位于x = N / 2的顶点。如果N是偶数,则max是整数。如果N是奇数,那么x = N / 2是一个分数,但是这样的抛物线是严格单峰的,所以越接近于n得到N / 2,产品越大。 x = floor(N / 2)(或上限,对称无关紧要)是最接近整数可以达到N / 2,因此{floor(N / 2),ceiling(N / 2)}是最优的对于整数。
一般情况:首先,存在全局最大值,因为只存在有限多个整数分区,并且有限的数字列表总是具有最大值。假设{x_1,x_2,...,x_P}是全局最优的。声明:给定和我,我们有
| x_i - x_ j | < = 1
换句话说:最优解中的任何两个数最多相差1.这紧跟在P = 2引理之后(应用于N = x_i + x_ j)。
根据这一说法,x_i中最多有两个不同的数字。如果只有1个数字,那么这个数字显然是N / P.如果有两个数字,则它们的形式为a和a + 1。令k = x_i的数量等于a + 1,因此x_i的P-k = a。因此
(P-k)a + k(a + 1)= N,其中k是1 <= k <1的整数。 P
但是简单代数产生a =(N-k)/ P = N / P-k / P.
因此 - a是整数&lt; N / P与N / P的差值小于1(k / P <1) 因此a = floor(N / P)和a + 1 = ceiling(N / P)。
QED