Это можно решить как Задача о ранце
В задаче о ранце у нас есть вектор значений (val) и весов (wt)
Мы хотим максимизировать сумму подмножества значений (val) таким образом, чтобы
соответствующий вес был меньше некоторого максимума (называемого емкостью)
Мы можем использовать алгоритм ранца следующим образом:
(1) Разрешение входного массива соответствует как весам, так и значениям
(2) Максимальная емкость - это максимальная сумма
Код для решения ранца отсюда
def knapSack(W , wt , val, n):
# Base Case
if n == 0 or W == 0 :
return 0
# If weight of the nth item is more than Knapsack of capacity
# W, then this item cannot be included in the optimal solution
if (wt[n-1] > W):
return knapSack(W , wt , val , n-1)
# return the maximum of two cases:
# (1) nth item included
# (2) not included
else:
return max(val[n-1] + knapSack(W-wt[n-1] , wt , val , n-1),
knapSack(W , wt , val , n-1))
def max_sum(K, arr):
'''Solve using Knapsack code with (set weights and values equal to arr)'''
return knapSack(K, arr, arr, len(arr))
Тест
arr = [1,5,4,6]
print(max_sum(13, arr))
#>>> Outputs 12
arr =[1,2,3,6,0, 8, 9, 12]
print(max_sum(20, arr))
#>>> Outputs 20
arr = [2,5,6,8]
print(max_sum(17, arr))
#>>> Outputs 16
Сложность
Временная сложность решения ранца составляет O (nW)
где n - длина массива arr
W - максимальная сумма