Sorunu biraz farklı (ancak eşdeğeri) bir şekilde yeniden ifade ederseniz, bir algoritma daha belirgin hale gelir:
Dahil olan parti var : n - 1 kişi ve bir restauarant. Let s ı para partinin miktarı i olmalıdır sonra yemek bitmiş ve ödenir. Örneğin, eğer Alice 36 dolar ve 25 dolar borçluysa , Bob 12 dolar ve borçludur.nn - 1pbenben 11 dolar ise , Carl 30 dolar ve 25 dolar borçluysa , 'nın restoran olduğunu ve şunu söylediğini söyleriz :p0
p = ( 61 , 11 , 1 , 5 )
Yani, yemek bittiğinde restoran 61 dolara , Alice 11 dolara , Bob 1 dolara ve Carl 5 dolara sahip olmalıydı .
bm
b = ( 1 , 5 , 10 , 20 , 1 , 1 , 5 , 5 , 10 , 20 )
Faturaların mezhepleri önemli değil, ama tanıdık oldukları için bu örnek ABD kağıt para cinsinden banknotlarını seçtim.
benj{0,1}CC0,j=0j
Örneğimize devam:
C=⎡⎣⎢⎢⎢0011001100110011010101010101010101100110⎤⎦⎥⎥⎥
Alice ile başladı gösterir $ 1, $ 5, $ 10, $ 20, Bob ile başlayan $ 1, $ 1, $ 5, $ 5, Carl ile başladı $ 10 ve $ 20.
Yine amaç, el değiştiren faturaların sayısını en aza indirmektir. Diğer bir deyişle:
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
İlk kısıtlama, çözümün yalnızca bir tarafa belirli bir faturayı atayabileceğini ve ikincisi de herkesin uygun miktarda ödeme yapmasını sağladığını söylüyor.
Bu 0,1 INTEGER PROGRAMLAMA problemi ve NP tamamlandı (bkz. [ Karp 1972 ]). Doğrusal programlama hakkındaki Wikipedia sayfası , bu tür problemlerde kullanılabilecek farklı algoritmalar hakkında bilgi içerir.
Potansiyel olarak çoklu optimal çözümler vardır; elde ettiğim örneğin ilk çözümü elimden aldı:
x=⎡⎣⎢⎢⎢0100100001001000101000000001100010001000⎤⎦⎥⎥⎥
hangi Alice tam olarak öder demektir $ 5 ve $ 20, Bob tam öder $ 1, $ 5 ve $ 5, Carl fazla ödeme $ 10 ve $ 20 ve daha sonra bir kaldırır $ tablo 5.
Ayrıca, farklı çözücü arka uçlarını ( GLPK , COIN , CPLEX veya Gurobi'yi kullanma yeteneğine sahip olan Sage Math sisteminin Karışık Tamsayılı Doğrusal Program modülünü kullandım. ) . Verdiği ilk çözüm
x=⎡⎣⎢⎢⎢0100100001001000001010000000100110001000⎤⎦⎥⎥⎥
bu da Carl’ın Bob’un masaya koyduğu “öteki” 5 doları alması dışında neredeyse aynı.
Cx
Azalan toplamı ödeyebilecek bir grup insanı tanımlayın? Ya da belki hala tüm faturayı ödeyebilecek bir grup insan, yani arkadaşlarının parasını öderler.
Nihai ifadeniz, faturaların isimlerinin sabit olması durumunda ilgilendiğiniz görülmesine neden oluyor, ancak bu sorunu değiştirmiyor.
O(1)