01背包问题
读取输入:首先读取物品数量n和背包容量v_total,然后读取每个物品的体积和价值,存入数组v和w。 初始化dp数组:创建一个大小为(n+1) x (v_total+1)的二维数组dp,初始值为0。 填充dp数组:遍历每个物品i和每个容量j,更新dp表。对于每个物品i和容量j,如果容量足够装下物品i,则比较不装和装的价值,取最大值;否则不装。 输出结果:dp[n][v_total]即为最大价值。
发布日期:2025-06-19 23:30:30
浏览次数:7
分类:精选文章
本文共 993 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要使用动态规划来解决0-1背包问题。我们有N个物品,每个物品都有体积和价值,背包的容量是V。目标是选择一些物品,使得总体积不超过背包容量,同时总价值最大化。
方法思路
我们使用一个二维数组dp,其中dp[i][j]表示处理前i个物品,且背包容量为j时的最大价值。初始时,dp[0][j]和dp[i][0]都为0,因为没有物品或者背包容量为0时,价值都是0。
对于每个物品i,我们有两种选择:装或者不装。如果不装,dp[i][j]就等于dp[i-1][j]。如果装,检查背包的剩余容量j是否足够容纳物品i的体积vi。如果够的话,dp[i][j]就等于dp[i-1][j - vi] + wi,否则只能不装。
解决代码
n, v_total = map(int, input().split())v = [0] * (n + 1)w = [0] * (n + 1)for i in range(1, n + 1): vi, wi = map(int, input().split()) v[i] = vi w[i] = wi# 初始化动态规划数组dp = [[0] * (v_total + 1) for _ in range(n + 1)]for i in range(1, n + 1): for j in range(1, v_total + 1): if j >= v[i]: dp[i][j] = max(dp[i-1][j], dp[i-1][j - v[i]] + w[i]) else: dp[i][j] = dp[i-1][j]print(dp[n][v_total])
代码解释
这种方法的时间复杂度是O(N*V),适用于N和V不超过1000的情况。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2026年06月11日 13时47分57秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php实现逆转数组
2023-03-01
PHP实现通过geoip获取IP地理信息
2023-03-01
PHP实现页面静态化、纯静态化及伪静态化
2023-03-01
php容许ajax跨域,PHP设置允许ajax跨域请求的两种常见方法
2023-03-01
RabbitMQ进程结构分析与性能调优
2023-03-01
PHP对接百度地图
2023-03-01
PHP对表单提交特殊字符的过滤和处理
2023-03-01
php对象引用和析构函数的关系
2023-03-01
RabbitMQ HTTP 认证后端项目常见问题解决方案
2023-03-01
PHP将图片转换成base64格式(优缺点)
2023-03-01
php将多个值的数组去除重复元素
2023-03-01
php局域网上传文件_PHP如何通过CURL上传文件
2023-03-01
PHP工具插件大全
2023-03-01
php布尔值的++
2023-03-01
PHP常量、变量作用域详解(一)
2023-03-01
PHP应用目录结构设计
2023-03-01
PHP应用程序连接MSQL数据库Demo(附crud程序)
2023-03-01
PHP应用程序连接Oracle数据库Demo(附Oracle客户端安装文件)
2023-03-01
PHP开发api接口安全验证
2023-03-01
PHP开发规范PSR
2023-03-01