【发布时间】:2012-04-20 21:10:38
【问题描述】:
我有n 袋糖果,因此没有两个袋子里面有相同数量的糖果(即它是一组A[] = {a0,a1,a2,...,ai,...,aj},其中ai != aj)。
我知道每个袋子里有多少糖果以及我拥有的糖果总数M。
我需要将袋子分给三个孩子,以便尽可能公平地分配糖果(即每个孩子都尽可能接近M/3)。
不用说,我可能不会撕开袋子来平衡计数——那么这个问题就变得微不足道了。
有没有人有任何想法如何解决这个问题——最好是在 Java 中?
编辑:
面试官希望我使用二维数组来解决问题:第一个孩子得到 x,第二个孩子得到 y,第三个得到其余的:S[x][y]。
在我尝试以下之后:
1] sort array n lg n
2] starting with largest remaining bag, give bag to kid with fewest candy.
这是我划分为两个孩子的解决方案(这是正确答案)。也许这将有助于获得 3 路分区。
int evenlyForTwo(int[] A, int M) {
boolean[] S = new boolean[M+1];
S[0]=true;//empty set
for(int i=0; i<A.length; i++)
for(int x=M; x >= A[i]; x--)
if(!S[x])
S[x]=S[x-A[i]];
int k = (int) M/2;
while(!S[k])
k--;
return k;//one kid gets k the other the rest.
}//
【问题讨论】:
-
孩子们的身高是否大致相同?另外,我们是否假设他们是理性的人(除了健康问题),目标是尽可能多地吃糖果?
-
让一个孩子把糖果分开,然后每个孩子拿起他们的包。最后做劈叉的孩子。当然,这不是在 Java 中的 :)
-
这是 3 分区问题 (en.wikipedia.org/wiki/Partition_problem),属于 NP-hard。
-
总是有蛮力的选项。没有人谈论性能。
-
@Keith +1,这是直接链接:en.wikipedia.org/wiki/3-partition_problem。子集和或分区问题的一些 (NP) 解决方案或 (P) 近似解决方案可能会有所帮助。