Jika Anda menyatakan kembali masalah dengan cara yang sedikit berbeda (tetapi setara), suatu algoritma menjadi lebih jelas:
Ada pihak yang terlibat: orang, dan satu restauarant. Biarkan menjadi jumlah pesta uang yang harus miliki setelah makan selesai dan dibayar. Misalnya, jika Alice memiliki $ 36 dan berutang $ 25, Bob memiliki $ 12 dan berutang $ 11, dan Carl memiliki $ 30 dan berutang $ 25, kami mengatakan bahwa adalah restoran dan memiliki:n - 1 p i i p 0nn - 1piip0
p=(61,11,1,5)
Yaitu, ketika makan di atas restoran harus memiliki $ 61, Alice harus memiliki $ 11, Bob harus memiliki $ 1 dan Carl harus memiliki $ 5.
Sekarang mari menghitung semua tagihan yang terlibat. Sebagai contoh:mbm
b=(1,5,10,20,1,1,5,5,10,20)
Denominasi tagihan tidak masalah, tetapi saya telah memilih denominasi mata uang kertas AS untuk contoh ini karena mereka akrab.
Kami berupaya meminimalkan jumlah tagihan yang berpindah tangan, jadi kami mengaitkan "biaya" dengan orang yang tinggalkan dengan tagihan dengan menggunakan matriks . Entri 0 dalam matriks ini menunjukkan tagihan mana yang dimulai dengan masing-masing pihak ( untuk semua karena restoran dimulai tanpa tagihan).j { 0 , 1 } C C 0 , j = 0 jij{0,1}CC0,j=0j
Melanjutkan contoh kami:
C=⎡⎣⎢⎢⎢0011001100110011010101010101010101100110⎤⎦⎥⎥⎥
menunjukkan bahwa Alice mulai dengan $ 1, $ 5, $ 10, $ 20, Bob mulai dengan $ 1, $ 1, $ 5, $ 5, dan Carl mulai dengan $ 10 dan $ 20.
Sekali lagi, tujuannya adalah untuk meminimalkan jumlah tagihan yang berpindah tangan. Dengan kata lain:
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
Batasan pertama mengatakan bahwa solusi hanya dapat menetapkan tagihan tertentu untuk satu pihak, dan yang kedua memastikan bahwa setiap orang membayar jumlah yang sesuai.
Ini adalah 0,1 INTEGER PROGRAMMING problem dan NP-complete (lihat [ Karp 1972 ]). Halaman Wikipedia tentang pemrograman linier memiliki informasi tentang berbagai algoritma yang dapat digunakan untuk jenis masalah ini.
Ada beberapa solusi optimal yang berpotensi; dengan tangan solusi pertama untuk contoh yang saya buat adalah:
x=⎡⎣⎢⎢⎢0100100001001000101000000001100010001000⎤⎦⎥⎥⎥
yang berarti Alice membayar tepat $ 5 dan $ 20, Bob membayar tepat $ 1, $ 5 dan $ 5, dan Carl membayar lebih dari $ 10 dan $ 20 dan kemudian mengeluarkan $ 5 dari tabel.
Saya juga menggunakan modul Program Integer Linier Campuran sistem Sage Math yang memiliki kemampuan untuk menggunakan backend solver yang berbeda ( GLPK , COIN , CPLEX , atau Gurobi ). Solusi pertama yang diberikannya adalah
x=⎡⎣⎢⎢⎢0100100001001000001010000000100110001000⎤⎦⎥⎥⎥
yang hampir sama kecuali bahwa Carl mengambil $ 5 "lainnya" yang diletakkan Bob di atas meja.
Merumuskan masalah dengan cara ini memenuhi semua properti yang Anda daftarkan (Anda dapat memperkirakan tagihan mana yang berasal dari dan matriks solusi ). Pengecualian mungkin # 4 yang dibahas dalam komentar pertanyaan. Tidak jelas bagi saya apa yang ingin Anda lakukan dalam situasi bahwa tidak ada solusi yang layak untuk himpunan persamaan linear:xCx
Identifikasi subset orang yang dapat membayar jumlah yang dikurangi? Atau mungkin sebagian orang yang masih bisa membayar seluruh tagihan, yaitu mereka membayar teman mereka.
Pernyataan akhir Anda membuatnya seolah-olah Anda tertarik pada kasus bahwa denominasi tagihan ditetapkan, namun ini tidak mengubah masalah.
Bagaimanapun, ada juga solusi di mana setiap orang membayar dengan kartu kredit.O(1)