蓝桥杯(三)——闫氏DP

系列文章目录


一、解题步骤

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

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

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

二、例题

1. 01背包问题

思路:

  1. 状态表示集(合dp[i][j]的含义):在背包承重为 [ 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)
相关推荐
kishu_iOS&AI31 分钟前
Python - 链表浅析
开发语言·python·链表
仰泳的熊猫42 分钟前
题目2571:蓝桥杯2020年第十一届省赛真题-回文日期
数据结构·c++·算法·蓝桥杯
大连好光景1 小时前
conda管理包还是pip管理包
python·conda·pip
m0_730115111 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
FreakStudio1 小时前
MicroPython+PycoClaw,3 分钟搞定 ESP32 跑上 OpenClaw!
python·单片机·嵌入式·电子diy
罗罗攀1 小时前
PyTorch学习笔记|张量的广播和科学运算
人工智能·pytorch·笔记·python·学习
傻啦嘿哟2 小时前
Python 操作 Excel 条件格式指南
开发语言·python·excel
2301_807367192 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
2301_795741792 小时前
构建一个基于命令行的待办事项应用
jvm·数据库·python
小鸡吃米…2 小时前
Python 网络爬虫 —— 环境设置
开发语言·爬虫·python