如下这段代码是蓝桥杯对局匹配问题一个同学给出的答案 我研读了很久 也始终有一点想不明白
为了方便各位大佬解答 n指的是用户总人数 k指的是积分差恰好为k的两个玩家方可匹配 list1是这n个玩家的对应积分值
我的疑问就是针对下面那段代码中 dp背包的索引j的实际含义是什么 这个动态规划到底是如何实现的 谢谢各位耐心解答
import os
import sys
n, k = map(int, input().split())
list1 = list(map(int, input().split()))
maxn = max(list1)
if k == 0:
print(len(set(list1)))
else:
val = [0 for i in range(maxn + 1)]
dp = [0 for i in range(maxn + 1)]
for i in list1:
val[i] += 1
res = 0
for j in range(maxn + 1):
if 2 * k <= j:
dp[j] = max(dp[j - k], dp[j - 2 * k] + val[j])
elif j < k:
dp[j] = val[j]
else:
dp[j] = max(dp[j - k], val[j])
s=0
for i in range(maxn-k+1,maxn+1):
s+=dp[i]
print(s)
for j in range(maxn + 1):
if 2 * k <= j:
dp[j] = max(dp[j - k], dp[j - 2 * k] + val[j])
elif j < k:
dp[j] = val[j]
else:
dp[j] = max(dp[j - k], val[j])