Учитывая список целых чисел и целевое целое число N, я хочу найти количество способов, которыми можно сложить целые числа в списке, чтобы получить N. Повторение разрешено. Это код:
def countWays(arr, m, N):
count = [0 for i in range(N + 1)]
# base case
count[0] = 1
# Count ways for all values up
# to 'N' and store the result
# m=len(arr)
for i in range(1, N + 1):
for j in range(m):
# if i >= arr[j] then
# accumulate count for value 'i' as
# ways to form value 'i-arr[j]'
if (i >= arr[j]):
count[i] += count[i - arr[j]]
# required number of ways
return count[N]
(от Geeksforgeeks)
Любая идея о том, как это сделать с помощью рекурсии и запоминания?
Добавлено объяснение
Если вы скопировали его из решения, он уже должен быть O(mN)
Проблема, которую вы пытаетесь решить, такая же, как количество способов внести сдачу на сумму, заданную списком номиналов. В вашем случае сумма аналогична целевому номеру N, а номиналы аналогичны списку целых чисел. Вот рекурсивный код. Ссылка https://www.geeksforgeeks.org/coin-change-dp-7/
# Returns the count of ways we can sum
# arr[0...m-1] coins to get sum N
def count(arr, m, N ):
# If N is 0 then there is 1
# solution (do not include any coin)
if (N == 0):
return 1
# If N is less than 0 then no
# solution exists
if (N < 0):
return 0;
# If there are no coins and N
# is greater than 0, then no
# solution exist
if (m <=0 and N >= 1):
return 0
# count is sum of solutions (i)
# including arr[m-1] (ii) excluding arr[m-1]
return count( arr, m - 1, N ) + count( arr, m, N-arr[m-1] );
Предназначена ли функция для печати количества упорядоченных последовательностей элементов из
arr
(имеющихm
элементов), допускающих повторения, сумма которых равнаN
?