#python #arrays #algorithm #data-structures #dynamic-programming
Вопрос:
Вопрос: Учитывая множество целых чисел, найдите максимальное число, которое мы можем получить как сумму подмножества этих целых чисел, так что никакие 2 целых числа не имеют абсолютной разницы в 1
Например:
- Если мультисет
[1,1,2,3,3,3,4,4,5,5,5,15]
,
то максимальная сумма равна (1 1 3 3 3 5 5 5 = 26)- Если мультисет
[3,3,4,4,4,5,5,5,5,6,6,10,20]
,
то максимальная сумма равна (3 3 5 5 5 5 10 20 = 56)
Моя попытка:
Это похоже на другой вопрос, связанный с нахождением подмножества с максимальной суммой таким образом, чтобы никакие два элемента не были смежными друг с другом. Для этого конкретного вопроса я использовал подход динамического программирования и использовал тот же подход, чтобы попытаться решить этот вопрос, но безуспешно. Любая помощь будет очень признательна!
from collections import Counter
def max_sum(nums):
c = Counter(nums)
N = sorted(set(nums))
if len(N) == 0:
return 0
if len(N) == 1:
return c[N[0]]*N[0]
if len(N) == 2:
return max(c[N[0]]*N[0], c[N[1]]*N[1])
dp = [0] * len(N)
dp[0] = c[N[0]]*N[0]
if (N[1] - N[0]) == 1:
dp[1] = max(c[N[0]]*N[0], c[N[1]]*N[1])
else:
dp[1] = sum([c[N[0]]*N[0], c[N[1]]*N[1]])
for i in range(2, len(N)):
if (N[i] - N[i-1]) == 1:
dp[i] = max(c[N[i]]*N[i] dp[i-2], dp[i-1])
else:
dp[i] = dp[i-1] c[N[i]]*N[i]
return dp[-1]
max_sum([1,1,1,5,5,5,6,6,6])