Tôi có 15 đô la trong túi của tôi. Tương tự như vậy, tôi đang ở trong một cửa hàng không thay đổi. Trong khi duyệt, tôi phát hiện ra một mặt hàng có giá $ 10 (đã bao gồm thuế). Tôi có thể mua món đồ đó mà không mất tiền không?
Trong trường hợp này, câu trả lời là có. Bất kể 15 đô la của tôi được chia như thế nào (một 10 và một 5, hoặc ba 5s, hoặc một cái gì khác), tôi sẽ luôn có chính xác 10 đô la cần thiết.
Lấy ví dụ thứ hai, tôi có 0,16 đô la trong túi. Những khoản tiền nào khác tôi phải có thể trả chính xác?
Possible Divisions:
0.01, 0.05, 0.10
0.01, 0.05 x 3
0.01 x 16
Guaranteed Exact Change:
0.01, 0.05, 0.06, 0.10, 0.11, 0.15, 0.16
Nếu tôi có 0,27 đô la trong túi thì sao?
Possible Divisions:
0.01 x 2, 0.25
0.01 x 2, 0.05, 0.10 x 2
0.01 x 2, 0.05 x 3, 0.10
0.01 x 2, 0.05 x 5
0.01 x 27
Guaranteed Exact Change:
0.01, 0.02, 0.25, 0.26, 0.27
Trong trường hợp trên, chỉ có một vài khoản tiền mà tôi sẽ luôn có sự thay đổi hoàn hảo.
Nhiệm vụ của bạn
Viết chương trình ngắn nhất (hoặc hàm được đặt tên) trong đó lấy A) một số tiền nguyên và B) một danh sách các mệnh giá có thể làm đầu vào và đưa ra danh sách các khoản tiền mà tôi phải có sự thay đổi hoàn hảo. Đầu vào có thể là STDIN hoặc đối số cho chương trình hoặc hàm. Tôi sẽ không quá nghiêm ngặt về định dạng đầu vào; nó có thể phù hợp với cách định dạng ngôn ngữ của bạn mảng.
Có lẽ một lời giải thích chi tiết hơn
Tôi có một số tiền nhất định trong túi của mình, được hình thành từ một tập hợp các minh chứng có thể có về tiền tệ. Nếu tôi có 8 đô la và tôi biết rằng các mệnh giá có thể là 2 đô la và 3 đô la, thì chỉ có rất nhiều tổ hợp hóa đơn khác nhau có thể có trong túi của tôi. Đây là 2+2+2+2và 3+3+2. Để có thể tạo ra một số tiền chính xác, tôi phải có khả năng sản xuất số lượng đó bằng cách sử dụng các hóa đơn duy nhất trong túi của mình. Nếu tôi có bốn 2 giây, tôi có thể sản xuất 2, 4, 6, or 8. Nếu tôi có hai số 3 và số 2, tôi có thể sản xuất 2, 3, 5, 6, or 8Vì tôi không biết những kết hợp nào tôi thực sự có trong túi, câu trả lời cuối cùng của tôi bị giảm xuống 2, 6, 8. Đây là những giá trị tôi biết tôi có thể tạo ra từ túi của mình, với tổng số tiền và các mệnh giá có thể.
Ví dụ tính toán I / O
7 [3, 4]
3, 4, 7 //only one possible division into 3 + 4
7 [3, 2]
2, 3, 4, 5, 7 //the only division is 3 + 2 + 2
6 [2, 3, 4]
6 //divisions are 2+2+2, 3+3, 2+4
16 [1, 5, 10, 25] //this represents one of the examples above
1, 5, 6, 10, 11, 15, 16
27 [1, 5, 10, 25] //another example from above
1, 2, 25, 26, 27
1500 [1, 5, 10, 25, 100, 500, 1000, 2000]
500, 1000, 1500
600 [100, 500, 1000, 2000]
100, 500, 600
600 [200, 1, 5, 10, 25, 100, 500, 1000, 2000]
600
6 [2, 3, 4]. Không thể 2+2+2tạo 3 và 3+3không tạo 2 và 4?