当前位置: 首页 > news >正文

【Python刷题】动态规划相关问题

动态规划(Dynamic Programming,简称 DP)是一种用于解决多阶段决策最优化问题的算法策略。它通过把原问题分解为相对简单的子问题,记录子问题的解(通常使用表格等数据结构存储),避免重复计算,从而高效地解决复杂的全局最优问题。
在这里插入图片描述

目录

  • 小红取数
    • 算法思路
    • 代码实现

小红取数

小红取数
在这里插入图片描述

算法思路

由于不同的选择组合,除以k后得到的余数也不相同,当选择一个数加上后,所得到的新值除以k后余数有可能会发生变化,而为了将这些值都能存起来并且找出最大的且余数为0的组合,我们要使用动态规划。因为能产生的余数有k中情况,于是创建一个长度为kdp数组。j作为dp数组的索引也表示相应位置存放的数值除k后的余数,所以最终的答案一定是dp[0]上的数。动态规划的初始状态就是所有数都不选,即和为0的时候余数为0,所以dp[0]初始设为0而其余的位置设为负无穷。用num遍历数组中的每个数,然后尝试加到dp数组中的每一个值上,得到新值为dp[j]+num,很容易会想到这个新值除以k的余数为(dp[j]+num)%k。但是!如果用(dp[j]+num)%k作为索引去访问dp中的元素就出现了bug,这是因为我们初始化的时候把索引0后的位置设为了负无穷,这样导致产生了无效的索引。为了能成功访问到新值除以k后的余数所对应的位置,可以利用同余的性质,当前位置的数除以k的余数为j是规定好的,而这个数在加上num之后,他除以k后的余数就为(j+num%k)%k。接着找到余数为(j+num%k)%k的位置上的值dp[(j+num%k)%k]dp[j]+num作比较,取较大者更新即可。而为了避免产生垃圾数据,在循环内部的操作都是在dp的副本数组上实现的,循环结束后再更新原dp数组

代码实现

n,k = map(int, input().split())
a = list(map(int, input().split()))
dp = [float('-inf')]*k
dp[0] = 0 
for num in a:new_dp = dp[:]# 复制一份dpfor j in range(k):# 遍历每个余数所对应的位置new_dp[(j+num%k)%k] = max(new_dp[(j+num%k)%k], dp[j]+num)# 如果当前余数的位置上的值加上num后得到的这个数大于这个数除k的余数的位置上的值,则更新dp = new_dp# 更新dp
print(dp[0] if dp[0] > 0 else -1)
http://www.lryc.cn/news/490098.html

相关文章:

  • 2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析
  • 论文阅读:SIMBA: single-cell embedding along with features
  • d3-quadtree 的属性、方法、示例
  • 初次体验加猜测信息安全管理与评估国赛阶段训练习
  • 在WSUS中删除更新
  • 5分钟轻松搭建Immich图片管理软件并实现公网远程传输照片
  • 数据集-目标检测系列- 昙花(昙花一现) 检测数据集 epiphyllum >> DataBall
  • 开源POC库推荐
  • vue3项目部署在阿里云轻量应用服务器上
  • javascrip页面交互
  • 【U盘车载音乐】某宝198的3068首车载专用音乐合集【高音质】24G
  • 【论文阅读】WGSR
  • 打造智能化在线教育平台详解:教培网校APP的架构设计与实现
  • 使用同一个链接,如何实现PC打开是web应用,手机打开是一个H5应用
  • STM32-- 调试 -日志输出
  • Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存
  • 小试牛刀-Anchor安装和基础测试
  • 51单片机基础01 单片机最小系统
  • RocketMQ文件刷盘机制深度解析与Java模拟实现
  • python语言基础-5 进阶语法-5.3 流式编程
  • JVM性能分析工具JProfiler的使用
  • 面试题: Spring中的事务是如何实现的?
  • vue2-代理服务器插槽
  • (python)unittest框架
  • 网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
  • 面试小结(一)
  • 笔试-笔记2
  • html5复习二
  • 大模型呼入机器人系统如何建设?
  • docker 部署 kvm 图形化管理工具 WebVirtMgr