Trả chung vấn đề hóa đơn


23

Có người ở một bàn. Người thứ phải trả đô la.i p inipi

Một số người không có hóa đơn phù hợp để trả chính xác , vì vậy họ đưa ra thuật toán sau.pi

Đầu tiên, mọi người đặt một số tiền của họ lên bàn. Sau đó, mỗi cá nhân lấy lại số tiền họ đã trả.

Các hóa đơn có một bộ mệnh giá cố định (không phải là một phần của đầu vào).

Một ví dụ: Giả sử có hai người, Alice và Bob. Alice nợ 5 đô la và có năm tờ 1 đô la . Bob nợ 2 đô la và có một hóa đơn 5 đô la . Sau khi Alice và Bob đặt tất cả tiền của họ lên bàn, Bob lấy lại 3 đô la , và mọi người đều vui vẻ.

Tất nhiên, có những lúc người ta không phải đặt tất cả tiền của mình lên bàn. Ví dụ: nếu Alice có một nghìn đô la hóa đơn, cô ấy không cần thiết phải đặt tất cả chúng lên bàn và sau đó lấy lại hầu hết chúng.

Tôi muốn tìm một thuật toán với các thuộc tính sau:

  1. Đầu vào chỉ định số lượng người, mỗi người nợ bao nhiêu và bao nhiêu hóa đơn của mỗi mệnh giá mỗi người.

  2. Thuật toán cho mỗi người biết hóa đơn nào sẽ được đặt lên bàn trong vòng đầu tiên.

  3. Thuật toán cho mỗi người biết loại hóa đơn nào cần loại bỏ khỏi bảng trong vòng thứ hai.

  4. Số lượng hóa đơn được đặt trên bàn + số lượng hóa đơn được xóa khỏi bảng được giảm thiểu.

Nếu không có giải pháp khả thi, thuật toán chỉ trả về lỗi.


9
Các mệnh giá của các hóa đơn được cố định trước (nói với các mệnh giá của Mỹ $ 1, $ 2, $ 5, $ 10, $ 20, $ 50 và $ 100), hoặc một phần của đầu vào? Nói cách khác, không thuật toán phải xử lý các khả năng mà Mephistopheles có ba $ 7 dự án luật, một $ hóa đơn 13, và mười lăm $ 4 hóa đơn ?
JeffE

1
Các hóa đơn được cố định. Tôi đoán trong trường hợp đó tôi không thể giảm tổng tập hợp con và chứng minh đó là NP-Hard. Tôi sẽ chỉnh sửa nó.
Chao Xu

1
Bạn cần một cách để thể hiện 4/5 như một tối ưu hóa duy nhất. Không thể tối ưu hóa cho hai điều kiện độc lập này. Tôi biết về những gì bạn dự định, tôi đã có một vấn đề tương tự trước đây, nhưng bạn cần định lượng chính xác ý nghĩa của nó để tối ưu hóa cho cả hai điều kiện.
edA-qa mort-ora-y

3
Tôi nghĩ rằng sẽ tốt hơn, như một điểm khởi đầu, để giả định rằng mọi người đều trả hóa đơn chính xác hoặc thuật toán chỉ báo cáo thất bại.
JeffE

2
Chính xác câu hỏi ở đây là gì, có yêu cầu phức tạp không? Viết một thuật toán ngây thơ có vẻ tầm thường, hoặc tôi đang thiếu một cái gì đó?
Stéphane Gimenez

Câu trả lời:


6

Nếu bạn lặp lại vấn đề theo một cách hơi khác (nhưng tương đương), một thuật toán sẽ trở nên rõ ràng hơn:

Có bên tham gia: người, và một người phục hồi. Đặt là số tiền bữa tiệc nên có sau khi bữa ăn kết thúc và được trả tiền. Ví dụ: nếu Alice có 36 đô la và nợ 25 đô la , Bob có 12 đô la và nợ 11 đô la và Carl có 30 đô la và nợ 25 đô la , chúng tôi nói rằng là nhà hàng và có:n - 1 p i i p 0nn1piip0

p=(61,11,1,5)

Đó là, khi bữa ăn kết thúc nhà hàng nên có $ 61, Alice nên có $ 11, Bob nên có $ 1 và Carl nên có $ 5.

Bây giờ hãy để liệt kê tất cả các hóa đơn liên quan. Ví dụ:mbm

b=(1,5,10,20,1,1,5,5,10,20)

Các mệnh giá của các hóa đơn không quan trọng, nhưng tôi đã chọn các mệnh giá tiền giấy của Mỹ cho ví dụ này vì chúng quen thuộc.

Chúng tôi đang tìm cách giảm thiểu số lượng hóa đơn mà tay thay đổi, vì vậy chúng tôi kết hợp một "chi phí" với người rời với hóa đơn bằng cách sử dụng một ma trận . Các mục nhập 0 trong ma trận này cho biết các hóa đơn mà mỗi bên bắt đầu bằng ( cho tất cả vì nhà hàng bắt đầu không có hóa đơn).j { 0 , 1 } C C 0 , j = 0 jij{0,1}CC0,j=0j

Tiếp tục ví dụ của chúng tôi:

C=[0000000000000011111111110000111111111100]

chỉ ra rằng Alice bắt đầu với $ 1, $ 5, $ 10, $ 20, Bob bắt đầu với $ 1, $ 1, $ 5, $ 5 và Carl bắt đầu với $ 10 và $ 20.

Một lần nữa, mục tiêu là giảm thiểu số lượng hóa đơn đổi tay. Nói cách khác:

Minimize:i=0n1j=0m1Ci,jxi,jsubject to:i=0n1xi,j=1 for 0j<m,j=0m1xi,jbj=pi for 0i<n,andxi,j0

Ràng buộc đầu tiên nói rằng giải pháp chỉ có thể chỉ định một hóa đơn cụ thể cho một bên và thứ hai đảm bảo rằng mọi người đều trả số tiền phù hợp.

Đây là vấn đề lập trình 0,1 INTEGER và hoàn thành NP (xem [ Karp 1972 ]). Trang Wikipedia về lập trình tuyến tính có thông tin về các thuật toán khác nhau có thể được sử dụng cho các loại vấn đề này.

Có nhiều giải pháp tối ưu; bằng tay giải pháp đầu tiên cho ví dụ tôi nghĩ ra là:

x=[0101100111101000000000001000000000001000]

có nghĩa là Alice trả chính xác $ 5 và $ 20, Bob trả chính xác $ 1, $ 5 và $ 5, và Carl trả quá $ 10 và $ 20 và sau đó xóa $ 5 khỏi bảng.

Tôi cũng đã sử dụng mô-đun Chương trình tuyến tính số nguyên hỗn hợp của hệ thống Sage Math có khả năng sử dụng các phụ trợ bộ giải khác nhau ( GLPK , COIN , CPLEX hoặc Gurobi ). Giải pháp đầu tiên mà nó đưa ra là

x=[0101010111101000000000001000000000000100]

gần như giống nhau ngoại trừ việc Carl lấy "5 đô la" khác mà Bob đặt lên bàn.

Xây dựng vấn đề theo cách này thỏa mãn tất cả các thuộc tính bạn liệt kê (bạn có thể ngoại suy hóa đơn nào kết thúc ở đâu từ và ma trận giải pháp ). Ngoại lệ có lẽ là # 4 đã được thảo luận trong các ý kiến ​​của câu hỏi. Tôi không rõ bạn muốn làm gì trong tình huống không có giải pháp khả thi nào cho tập hợp các phương trình tuyến tính:xCx

Xác định một tập hợp con người có thể trả tổng số giảm? Hoặc có lẽ một tập hợp con người vẫn có thể trả toàn bộ hóa đơn, tức là họ trả tiền cho bạn của họ.

Tuyên bố cuối cùng của bạn làm cho có vẻ như bạn quan tâm đến trường hợp các mệnh giá của các hóa đơn được cố định, tuy nhiên điều này không làm thay đổi vấn đề.

Trong mọi trường hợp, cũng có một giải pháp trong đó mọi người thanh toán bằng thẻ tín dụng.O(1)


Rằng vấn đề này có thể được thể hiện khi IP đã (gần như?) Rõ ràng; nhưng giải pháp này tốt như thế nào? IP của mẫu đã tạo có thể được giải quyết hiệu quả không? Nếu không, có một thuật toán nhanh hơn?
Raphael

Tồn tại một dạng cô đọng hơn của IP này, bằng cách có một biến số cho các hóa đơn có mệnh giá cụ thể hơn một biến 0,1. Các mệnh giá cố định làm thay đổi độ phức tạp một chút, nếu số lượng người cũng cố định, thuật toán của Lenstra có thể giải quyết nó trong thời gian đa thức.
Chao Xu

-2

Chắc chắn một số khởi đầu cơ bản có thể bao gồm các hóa đơn nhỏ nhất có sẵn để đạt được tổng số tiền của tổng hóa đơn. Nếu bạn không quan tâm đến việc cho phép hóa đơn 2 đô la , mỗi người chỉ cần xóa hóa đơn lớn nhất họ có thể lấy từ nhóm sau đó và sẽ đến đó tương đối nhanh chóng. Các $ hóa đơn 2 ném mà ra vì nó không chia nhỏ độc đáo vào hệ phái khác và rất phức tạp vấn đề. Chắc chắn cũng có một số tối ưu hóa khác có thể được thực hiện để quan sát về sự cần thiết phải thêm tiền trong vòng 1 (ví dụ: nếu tổng số hóa đơn 1 đô la đủ để chi trả cho hóa đơn, thì tất cả mọi người có thể ngừng đưa vào trừ khi họ chưa đưa đủ cho hóa đơn của họ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.