J'ai n
sacs de bonbons tels que deux sacs n'ont pas le même nombre de bonbons à l'intérieur (c'est-à-dire que c'est un ensemble A[] = {a0,a1,a2,...,ai,...,aj}
donde ai != aj
).
Je sais combien de bonbons il y a dans chaque sac et le nombre total M
de bonbons que j'ai.
Je dois répartir les sacs entre trois enfants de façon à ce que les bonbons soient distribués le plus équitablement possible (c'est-à-dire que chaque enfant reçoive le plus près possible de la quantité de bonbons qu'il désire). M/3
dans la mesure du possible).
Inutile de dire que je ne vais peut-être pas déchirer les sacs pour égaliser les comptes - la question serait alors triviale.
Quelqu'un a-t-il une idée de la façon de résoudre ce problème, de préférence en Java ?
EDITAR:
l'interviewer voulait que j'utilise un tableau à deux dimensions pour résoudre le problème : le premier enfant reçoit x, le deuxième y, le troisième le reste : S[x][y]
.
Ceci après que j'ai essayé de suivre :
1] sort array n lg n
2] starting with largest remaining bag, give bag to kid with fewest candy.
Voici ma solution pour le partitionnement en deux enfants (c'est la bonne réponse). Peut-être que cela vous aidera à obtenir la partition à trois.
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.
}//