私はn
2 つの袋の中に同じ数のキャンディーが入っていないように、キャンディーの袋を持っています (つまり、 のセットA[] = {a0,a1,a2,...,ai,...,aj}
ですai != aj
)。
各袋にいくつのキャンディーが入っているか、また持っているキャンディーの総数を知っM
ています。
キャンディーができるだけ公平に分配されるように (つまり、各子供がM/3
できるだけ近くにくるように)、バッグを 3 人の子供に分ける必要があります。
言うまでもなく、数を均等にするために袋を引き裂くことはできません。そうであれば、問題は些細なことです。
これを解決する方法を考えている人はいますか - できれば Java で?
編集:
インタビュアーは、問題を解決するために 2 次元配列を使用するように私に求めましたS[x][y]
。
これは、次のことを試した後です:
1] sort array n lg n
2] starting with largest remaining bag, give bag to kid with fewest candy.
これが、2 つの子に分割するための私の解決策です (正解です)。たぶん、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.
}//