01背包问题
题目描述
有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i
件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8
解题思路:动态规划
参数定义:
- N件物品
- V 背包的总容量
- Ci放入第 i 件物品耗费的费用
- Wi放入第 i 件物品得到的价值
定义状态
表示在前 件物品中选择总重量不超过 的物品,可以使得总价值最大,其中。
对于第个物品,有两种可能:放入或者不放入
-
不放入第 i 件物品,背包容量不变,问题变为
-
放入第 i 件物品,背包容量减小,问题变为 ,
因为第 i 件物品已经放进去背包,获取的价值是 Wi,留给前 i−1 件物品的背包容量只有V−Ci
最优方案就是比较两种选择哪个更好,
转移方程
边界条件
初始状态 为 0 表示不装任何东西
代码实现
Python
二维DP
N,V = map(int, input().split()) dp = [[0]*(V+1) for _ in range(N)] for i in range(N): vi, wi = map(int, input().split()) for j in range(V, vi-1, -1): dp[i][j] = max(dp[i-1][j], dp[i-1][j-vi]+wi) print(dp[-1][-1])
时间复杂度
空间复杂度
空间优化-一维DP
V,N = map(int, input().split()) dp = [0] * (V + 1) for i in range(N): # print(i) vi, wi = map(int, input().split()) for j in range(V, vi - 1, -1): dp[j] = max(dp[j], dp[j - vi] + wi) print(dp[-1])
时间复杂度
空间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)