ElKaminaとTylerDurdenの答えはまともですが、栗曽が1対1の取引をしたい、人々が複数の商品や複数の商品を持っている可能性があることを考慮していないようです。私にはそうする素朴な解決策があります。
元の例は少し単純化されすぎたと思うので、別の例を見てみましょう。
c1 c2 c3 c4
A 5 0 1 0
B 0 1 0 1
C 0 6 2 0
ここで、A、B、Cは人であり、c1、c2、c3、c4は商品です。
まず、簡単に実行できる理想的な分布を計算しましょう。商品ごとに、合計を人数で割って切り捨てると、全員が次のようになります。
c1 c2 c3 c4
A 1 2 1 0
B 1 2 1 0
C 1 2 1 0
ここで、人Xが理想的な位置に到達するために必要なものの量を示すWANT関数を定義しましょう:WANT(X、c)= IDEAL(c)-Xc。
c1 c2 c3 c4 sum
A -4 2 0 0 -2
B 1 1 1 0 3
C 1 -4 -1 0 -4
欲求の合計で並べ替えた人のリストを作りましょう。最も裕福な人、この場合は最も欲求が低い人、この場合はCを取り上げ、彼が最も欲しがっている商品を最も提供している人と彼を一致させることによって、彼の欲求を満たすようにしましょう。彼らが取引を行うことができれば、素晴らしいですが、そうでない場合は、一致するものが見つかるまで続けます(最終的には一致が保証されます)。この例では、Cにはc1が必要です。最も多くのc1を提供するのはAであり、商品を繰り返し処理します。Aにはc2が必要であり、Cには余剰のc2があるため、それらを交換します。リスト内の位置を更新するか、必要がなくなった場合は削除します。誰も欲しがらなくなるまでこれを繰り返します。これは適切に均等な分配を生成しませんが、1回の取引で1ずつ到達できる限り均等になります。
これは確かに素朴な解決策であり、最も裕福な人が必要な商品の見返りに物を提供する可能性が最も高いというヒューリスティックを備えています。複雑さは高いですが、順序付きリストを使用すると、指定した数に対して管理可能である必要があります。