蓝桥杯(三)——闫氏DP

系列文章目录


一、解题步骤

1. 大问题化为小问题 :例如:dpi表示前i个数的某种方法的个数

2. 确定需要求的集合属性:max/min/count

3. 状态计算:一般以最后一步来划分集合

二、例题

1. 01背包问题

思路:

  1. 状态表示集(合dpij的含义):在背包承重为 j 的前提下,从前 i 个物品中选能够得到的最大价值

  2. 集合属性:求max

  3. 状态计算:将集合划分为有第i个背包和没有第i个背包的两种情况

代码:

python 复制代码
N,V=map(int,input().split())
v=[0]#体积
w=[0]#价值
#输入体积和价值
for i in range(N):
    a,b=map(int,input().split())
    v.append(a)
    w.append(b)
f=[[0 for i in range(V+1)]for i in range(N+1)]
for i in range(1,N+1):
    for j in range(V+1):
        f[i][j]=f[i-1][j]
        if j>=v[i]:
            f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i])
           #完全背包
           #f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i])
print(f[N][V])

2. 完全背包问题

python 复制代码
#f[i][j]:所以前i个背包,体积为j的价值
N,V=map(int,input().split())
v=[0]
w=[0]
for i in range(N):
    a,b=map(int,input().split())
    v.append(a)
    w.append(b)
f=[[0 for i in range(1010)]for j in range(N+1)]
for i in range(1,N+1):
    for j in range(0,V+1):
        f[i][j]=f[i-1][j]
        if j-v[i]>=0:
            f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i]) #与01背包只有此处不同
print(f[N][V])

3. 线性DP

python 复制代码
#状态表示:dp[i] 长度 dp[i] i:所有到w[i]时的方案数
#max
#最后:if w[j]>w[i]: f[i]+=1 
n=int(input())
w=list(map(int,input().split()))
f=[[0 for i in range(n+1)]for i in range(n+1)]
result=0
for i in range(1,n+1):
    f[i]=1 #空集,只有a[i]一个
    for j in range(1,i):
        if w[j-1]<w[i-1]: 
            f[i]=max(f[i],f[j]+1)
    result=max(result,f[i])
print(result)
相关推荐
IT知识分享8 分钟前
从零开发在线简繁转换工具:OpenCC 实战、避坑经验与方案选型
javascript·python
lunzi_082613 分钟前
【学习笔记】《Python编程 从入门到实践》第8章:函数定义、参数传递与模块导入
笔记·python·学习
杨运交30 分钟前
[030][Web模块]Spring Boot 验证与 OpenAPI 集成实战:从校验规则到文档生成
前端·spring boot·python
培培说证1 小时前
2026财务岗位如何快速提升自身能力
python
努力攻坚操作系统1 小时前
编程语言编译运行机制对比:C / Java / Python
java·c语言·python
godspeed_lucip1 小时前
LLM和Agent——专题6:Multi Agent 入门(5)
人工智能·python
Metaphor6922 小时前
使用 Python 给 PDF 设置背景色或背景图
数据库·python·pdf
郝亚军2 小时前
如何让pycharm-2026.1.2顶部菜单栏固定显示在最上端
python
怪兽学LLM3 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode