Для решения данной задачи можно использовать алгоритм динамического программирования.
1. Создадим массив dp размером N+1 и инициализируем его значениями -1. Здесь dp[i] будет содержать минимальное количество монет, необходимых для получения суммы i.
2. Первоначально dp[0] = 0, так как для получения суммы 0 монеты не требуются.
3. Для каждой монеты A[i], будем обновлять значения в массиве dp. Итерируемся по значениям от A[i] до N, и обновляем значения минимального количества монет dp[j] = min(dp[j], dp[j - A[i]] + 1), если значение dp[j - A[i]] + 1 меньше текущего значения dp[j]. Таким образом, мы находим минимальное количество монет для каждой суммы j.
4. После завершения цикла, проверяем значение dp[N]. Если оно равно -1, то денег недостаточно и возвращаем -1. Если dp[N] не равно -1, то это означает, что можно заплатить указанную сумму без сдачи.
5. Чтобы восстановить использованные монеты, создаем массив coins размером K+1, где K - количество монет, необходимых для платежа N. Инициализируем его значениями -1. Затем, начиная с dp[N] и перемещаясь назад по значениям dp, заполняем массив coins монетами, которые использовались для получения суммы N.
6. Возвращаем K и значения coins.
Вот реализация данного алгоритма на языке Python:
```python
def find_solution(N, M, coins):
dp = [-1] * (N+1)
dp[0] = 0
for i in range(M):
for j in range(coins[i], N+1):
if dp[j - coins[i]] != -1 and (dp[j] == -1 or dp[j - coins[i]] + 1 < dp[j]):
dp[j] = dp[j - coins[i]] + 1
if dp[N] == -1:
return -1
k = dp[N]
result = [-1] * (k+1)
curr_sum = N
while k > 0:
for i in range(M):
if curr_sum >= coins[i] and dp[curr_sum - coins[i]] == k - 1:
result[k] = coins[i]
curr_sum -= coins[i]
k -= 1
break
return k, result[1:]
```
Пример использования:
```python
N = 10
M = 3
coins = [1, 2, 5]
print(find_solution(N, M, coins)) # Вывод: (1, [5])
```
В данном примере Волшебный человечек должен заплатить сумму 10 с использованием монет достоинства 1, 2 и 5. С помощью данной программы мы находим решение - восстанавливаем использованные монеты. В данном случае, необходимо отдать 1 монету достоинством 5.