我有n
一袋糖果,所以没有两个袋子里面有相同数量的糖果(即它是一组A[] = {a0,a1,a2,...,ai,...,aj}
where 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.
}//