2301_77135373 2024-01-23 17:02 采纳率: 33.3%
浏览 6

python算法问题求解

如下这段代码是蓝桥杯对局匹配问题一个同学给出的答案 我研读了很久 也始终有一点想不明白

为了方便各位老哥解答 n指的是用户总人数 k指的是积分差恰好为k的两个玩家方可匹配 list1是这n个玩家的对应积分值

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)

我的疑问就是针对下面那段代码中 dp背包的索引j的实际含义是什么 这个动态规划到底是如何实现的 谢谢各位耐心解答

  • 写回答

2条回答 默认 最新

  • K_n_i_g_h_t_1990 2024-01-23 17:14
    关注

    dp 数组的索引 j 的实际含义是:当前考虑的积分是 j。dp[j] 的值是:在积分为 j 的情况下,最多有多少个用户无法匹配。这个值是根据以下规则计算的:

    如果 j < k,那么说明积分为 j 的用户无法和任何其他用户匹配,所以 dp[j] = val[j],即积分为 j 的用户的个数。
    如果 j >= k,那么说明积分为 j 的用户可能和积分为 j - k 的用户匹配,所以 dp[j] = max(dp[j - k], val[j]),即在不匹配的情况下,积分为 j 的用户的个数,和在匹配的情况下,积分为 j - k 的用户的最优解,两者取较大值。
    如果 j >= 2 * k,那么说明积分为 j 的用户可能和积分为 j - k 或者 j - 2 * k 的用户匹配,所以 dp[j] = max(dp[j - k], dp[j - 2 * k] + val[j]),即在不匹配的情况下,积分为 j - k 的用户的最优解,和在匹配的情况下,积分为 j - 2 * k 的用户的最优解加上积分为 j 的用户的个数,两者取较大值。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月23日

悬赏问题

  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来