У мене в кишені 15 доларів. Так само я перебуваю в магазині, який не дає змін. Під час перегляду я помічаю товар, який коштує 10 доларів США (з податком). Чи можу я придбати цей предмет, не втрачаючи грошей?
У цьому випадку відповідь - так. Незалежно від того, як розділено мої 15 доларів (один 10 і один 5, або три 5, або щось інше), у мене завжди будуть потрібні точні 10 доларів.
Як другий приклад, у мене в кишені 0,16 долара. Які ще гроші я повинен мати можливість платити саме?
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
Що робити, якщо у мене в кишені є 0,27 долара?
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
У вищенаведеному випадку було лише кілька грошей, на які я завжди мав би ідеальну зміну.
Ваше завдання
Напишіть найкоротшу програму (або названу функцію), яка приймає A) цілу кількість грошей і B) список можливих номіналів як вхідних даних, і виводить список сум грошей, на які я повинен мати ідеальні зміни. Вхід може бути STDIN або аргументом для програми або функції. Я не буду надто суворим щодо форматування вводу; це може відповідати тому, як ваші мови форматують масиви.
Можливо, більш детальне пояснення
У мене в кишені є певна кількість грошей, яка формується з набору можливих демонстрацій валюти. Якщо у мене є 8 доларів, і я знаю, що можливі номінали - 2 і 3 долари, то є лише стільки різних комбінацій купюр, які можуть бути в моїй кишені. Це є 2+2+2+2
і 3+3+2
. Щоб я міг отримати точну суму грошей, я маю змогу виготовити цю кількість, використовуючи лише ті рахунки, які є в моїй кишені. Якби у мене було чотири 2, я б міг виробляти 2, 4, 6, or 8
. Якби у мене було два 3-х та 2-х, я міг би створити, 2, 3, 5, 6, or 8
оскільки я не знаю, яку з цих комбінацій насправді маю в кишені, моя остаточна відповідь зводиться до 2, 6, 8
. Це ті значення, які я знаю, що я міг би отримати з кишені, враховуючи загальну суму та можливі номінали.
Приклад введення / виводу вручну
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]
. Не можете 2+2+2
зробити 3 і 3+3
не зробити 2 і 4?