わずかに異なる(ただし同等の)方法で問題を再度説明すると、アルゴリズムがより明確になります。
関係するパーティーがあります:n − 1人、および1つのレストラン。してみましょうpが、私はお金のパーティーの量であれば、私が持っている必要があります後、食事が終わると、ために支払われます。アリスが持っている場合たとえば、$ 36と負って$ 25、ボブはあり$ 12と負って$ 11、そしてカールが持つ$ 30と負って$ 25、我々はと言うのp 0はレストランで、持っています:nn−1piip0
p=(61,11,1,5)
つまり、食事が終わると、レストランは61 ドル、アリスは11 ドル、ボブは1 ドル、カールは5 ドルになるはずです。
次に、関連するm個の請求書すべてを列挙させます。例えば:bm
b=(1,5,10,20,1,1,5,5,10,20)
法案の額面は重要ではありませんが、この例ではおなじみなので、米国の紙幣の額面を選択しました。
私たちは、人との「コスト」を関連付けるので、法案その変更の手の数を最小限にしようとしている請求書を残しjを使用することにより、{ 0 、1 }行列Cを。このマトリックスの0のエントリは、各パーティーがどの請求書で始まるかを示します(レストランは請求書なしで始まるため、すべてのjについてC 0 、j = 0)。ij{0,1}CC0,j=0j
例の続き:
C=⎡⎣⎢⎢⎢0011001100110011010101010101010101100110⎤⎦⎥⎥⎥
Aliceは$ 1、$ 5、$ 10、$ 20で始まり、Bobは$ 1、$ 1、$ 5、$ 5で始まり、Carlは$ 10と$ 20で始まったことを示します。
繰り返しますが、目標は、手を変える請求書の数を最小限にすることです。言い換えると:
Minimize:subject to:and∑i=0n−1∑j=0m−1Ci,jxi,j∑i=0n−1xi,j=1 for 0≤j<m,∑j=0m−1xi,jbj=pi for 0≤i<n,xi,j≥0
最初の制約では、ソリューションでは特定の請求書を1つの関係者にしか割り当てることができず、2番目の制約では、全員が適切な金額を支払うことが保証されます。
これは0,1 INTEGER PROGRAMMING問題であり、NP完全です([ Karp 1972 ]を参照)。線形計画法に関するウィキペディアのページには、これらのタイプの問題に使用できるさまざまなアルゴリズムに関する情報があります。
潜在的に複数の最適なソリューションがあります。手で私が思いついた例の最初の解決策は次のとおりでした:
x=⎡⎣⎢⎢⎢0100100001001000101000000001100010001000⎤⎦⎥⎥⎥
これは、アリスが正確支払い手段$ 5と$ 20は、ボブが正確に支払う$ 1 $ 5と$ 5、及びカールoverpays $ 10および$ 20、その後除去$テーブルから5。
また、さまざまなソルバーバックエンド(GLPK、COIN、CPLEX、またはGurobi)を使用できるSage MathシステムのMixed Integer Linear Programモジュールも使用しました。最初の解決策は
x=⎡⎣⎢⎢⎢0100100001001000001010000000100110001000⎤⎦⎥⎥⎥
これは、CarlがBobがテーブルに置いた「その他」の5ドルを受け取ったことを除いて、ほぼ同じです。
この方法で問題を定式化すると、リストしたすべてのプロパティが満たされます(どの請求書がどこから来るかを推定できます) C およびソリューションマトリックス バツ)。例外はおそらく質問のコメントで議論された#4です。線形方程式のセットに実行可能な解決策がないという状況で、あなたが何をしたいのかは明確ではありません:
削減された合計を支払うことができる人々のサブセットを特定しますか?またはおそらく、請求書全体を支払うことができる人々のサブセット、つまり、彼らは彼らの友人のために支払う。
あなたの最終的な声明は、あなたが法案の額面が固定されている場合に興味を持っているように見えますが、これは問題を変えません。
いずれにせよ、もあります O (1 ) すべての人がクレジットカードで支払うソリューション。