আপনি যদি সমস্যাটি কিছুটা ভিন্ন (তবে সমতুল্য) উপায়ে পুনরুদ্ধার করেন তবে একটি অ্যালগরিদম আরও সুস্পষ্ট হয়ে ওঠে:
এর মধ্যে পার্টি রয়েছে: এন - 1 জন ব্যক্তি এবং একটি পুনরুদ্ধারকারী au যাক পি আমি টাকা পার্টির পরিমাণ আমি থাকা উচিত পর খাবার শেষ করে জন্য অর্থ প্রদান করা হয়। উদাহরণস্বরূপ, যদি অ্যালিসের $ 36 এবং $ 25 owণী থাকে তবে ববের 12 ডলার এবং owণী আছেnn−1pii $ 11, এবং কার্ল হয়েছে $ 30 এবং ঋণী $ 25, আমরা বলতে যে রেস্তোরাঁ এবং আছে:p0
p=(61,11,1,5)
অর্থাত্, যখন রেস্তোঁরাটি খাবারের শেষে হয় $ 61, অ্যালিসের 11 ডলার , ববের 1 ডলার এবং কার্লের 5 ডলার হওয়া উচিত ।
এখন যাক জড়িতসমস্ত মি বিলেগণনা। উদাহরণ স্বরূপ:bm
b=(1,5,10,20,1,1,5,5,10,20)
বিলের সংজ্ঞাগুলি কিছু বিবেচনা করে না, তবে আমি এই উদাহরণের জন্য কাগজের মার্কিন মুদ্রার সংজ্ঞা বেছে নিয়েছি কারণ তারা পরিচিত।
আমরা যে হাত পরিবর্তন বিল সংখ্যা কমানোর জন্য তাই আমরা ব্যক্তির সাথে শরীক একটি "খরচ" চাইছেন বিলের যাব ঞ একটি ব্যবহার করে { 0 , 1 } ম্যাট্রিক্স সি । এই ম্যাট্রিক্সে 0 এর এন্ট্রিগুলি নির্দেশ করে যা প্রতিটি পক্ষের সাথে बिलগুলি শুরু হয় ( সি 0 ,ij{0,1}Cসমস্তজে জন্যকারণ রেস্তোঁরা কোনও বিল ছাড়াই শুরু হয়)।C0,j=0j
আমাদের উদাহরণ অবিরত:
C=⎡⎣⎢⎢⎢0011001100110011010101010101010101100110⎤⎦⎥⎥⎥
ইঙ্গিত করে যে এলিস দিয়ে শুরু $ 1, $ 5, $ 10, $ 20, বব দিয়ে শুরু $ 1, $ 1, $ 5, $ 5, এবং কার্ল দিয়ে শুরু $ 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
প্রথম সীমাবদ্ধতা বলছে যে সমাধানটি কেবল একটি পক্ষকে একটি নির্দিষ্ট বিল অর্পণ করতে পারে, এবং দ্বিতীয়টি নিশ্চিত করে যে প্রত্যেকে উপযুক্ত পরিমাণ প্রদান করবে।
এটি 0,1 ইন্টিগ্রেটার প্রোগ্রামিং সমস্যা এবং এনপি-সম্পূর্ণ (দেখুন [ কার্প 1972 ])। লিনিয়ার প্রোগ্রামিং সম্পর্কিত উইকিপিডিয়া পৃষ্ঠায় বিভিন্ন অ্যালগরিদমের তথ্য রয়েছে যা এই ধরণের সমস্যার জন্য ব্যবহার করা যেতে পারে।
সম্ভাব্য একাধিক অনুকূল সমাধান রয়েছে; হাতে প্রথম যে সমাধানটি আমি নিয়ে এসেছি তা হ'ল:
x=⎡⎣⎢⎢⎢0100100001001000101000000001100010001000⎤⎦⎥⎥⎥
যা এলিস বহন করেনা ঠিক মানে $ 5 এবং $ 20, বব ঠিক বহন করেনা $ 1, $ 5 এবং $ 5, এবং কার্ল overpays $ 10 $ 20 এবং তারপর একটি সরিয়ে ফেলা হবে $ টেবিল থেকে 5।
আমি সেজ ম্যাথ সিস্টেমের মিশ্রিত পূর্ণসংখ্যার লিনিয়ার প্রোগ্রাম মডিউলটিও ব্যবহার করেছি যা বিভিন্ন সলভার ব্যাকেন্ডগুলি ( GLPK , COIN , CPLEX , বা গুরুবি ) ব্যবহার করার ক্ষমতা রাখে । এটি প্রথম সমাধানটি দিয়েছিল
x=⎡⎣⎢⎢⎢0100100001001000001010000000100110001000⎤⎦⎥⎥⎥
which is almost the same except that Carl took the "other" $5 that Bob put on the table.
Formulating the problem in this way satisfies all the properties you list (you can extrapolate which bills end up where from C and the solution matrix x). The exception is perhaps #4 which was discussed in the comments of the question. It is not clear to me what you would like to do in the situation that there is no feasible solution to the set of linear equations:
Identify a subset of people that can pay the reduced total? Or perhaps a subset of people which could still pay the entire bill, i.e. they pay for their friend.
Your final statement makes it seem like you are interested in the case that the denominations of the bills are fixed, this doesn't change the problem however.
In any case, there is also an O(1) solution in which every person pays with a credit card.