Python 背包问题

news2024/9/22 15:31:07

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。


本文目录

    • 背包问题
    • 0-1 背包问题
    • 完全背包问题
    • 多重背包问题


背包问题

背包问题Knapsack Problem)是一类常见的组合优化问题。其问题描述为:给定一个固定大小、能够携重 W W W 的背包,以及一组有价值和重量的物品,找出一个最佳解决方案,使得装入背包的物品总重量不超过 W W W,且总价值最大。

背包问题

通常情况下,背包问题可以分为以下三类:

  • 0-1 背包问题:每种物品仅有一件,可以选择放或不放。
  • 完全背包问题:每种物品有无限件,可以选择放多少件或不放。
  • 多重背包问题:每种物品有 n i n_i ni 件,可以选择放多少件或不放。

本文将介绍如何使用 Python 解决以上三类背包问题。


0-1 背包问题

0-1 背包问题0-1 Knapsack Problem)是最基础的背包问题。其问题描述为:给定一个固定大小、能够携重 W W W 的背包,以及 N N N 个价值、重量分别为 v i v_i vi w i w_i wi 的物品,找出一个最佳解决方案,使得装入背包的物品总重量不超过 W W W,且总价值最大。

有一个容量为 10 10 10 的背包,现有 4 4 4 个物品,其价值和重量分别为:

物品1234
价值1359
重量2347

求背包能装下的最大价值以及取得最大价值时的物品组合。

N = 4  # 物品数量
W = 10  # 背包容量
v = [0, 1, 3, 5, 9]  # 物品价值
w = [0, 2, 3, 4, 7]  # 物品重量
dp = [[0] * (W + 1) for _ in range(N + 1)]  # dp[i][j] 表示前 i 个物品放入容量为 j 的背包的最大价值
flag = [
    [0] * (W + 1) for _ in range(N + 1)
]  # flag[i][j] 表示前 i 个物品放入容量为 j 的背包最大价值时装入物品的最大编号

# dp 求解最大价值并更新 flag
for i in range(1, N + 1):
    for j in range(1, W + 1):
        if j < w[i]:
            dp[i][j] = dp[i - 1][j]
        elif dp[i - 1][j] > dp[i - 1][j - w[i]] + v[i]:
            dp[i][j] = dp[i - 1][j]
            flag[i][j] = flag[i - 1][j]
        else:
            dp[i][j] = dp[i - 1][j - w[i]] + v[i]
            flag[i][j] = i - 1
ans = dp[N][W]

# 追踪解方案
sol = [0] * N
while flag[N][W] != 0:
    temp = flag[N][W]
    sol[temp] = 1
    W -= w[temp]
    N = temp - 1

# 输出结果
print(f"最大价值为:{ans}")
print(f"取得最大价值时的物品组合为:{sol}")

结果

最大价值为:12
取得最大价值时的物品组合为:[0, 1, 0, 1]

完全背包问题

完全背包问题Unbounded Knapsack Problem)是背包问题的一种变种。其问题描述为:给定一个固定大小、能够携重 W W W 的背包,以及 N N N 个价值、重量分别为 v i v_i vi w i w_i wi 的物品,每种物品有无限件,可以选择放多少件或不放,找出一个最佳解决方案,使得装入背包的物品总重量不超过 W W W,且总价值最大。

有一个容量为 15 15 15 的背包,现有 4 4 4 个物品,其价值和重量分别为:

物品1234
价值1359
重量2347

求背包能装下的最大价值以及取得最大价值时的物品组合。

N = 4  # 物品数量
W = 15  # 背包容量
v = [0, 1, 3, 5, 9]  # 物品价值
w = [0, 2, 3, 4, 7]  # 物品重量
dp = [[0] * (W + 1) for _ in range(N + 1)]  # dp[i][j] 表示前 i 个物品放入容量为 j 的背包的最大价值
flag = [
    [0] * (W + 1) for _ in range(N + 1)
]  # flag[i][j] 表示前 i 个物品放入容量为 j 的背包最大价值时装入物品的最大编号

# dp 求解最大价值并更新 flag
for i in range(1, N + 1):
    for j in range(1, W + 1):
        if j >= w[i]:
            if dp[i - 1][j] < dp[i][j - w[i]] + v[i]:
                dp[i][j] = dp[i][j - w[i]] + v[i]
                flag[i][j] = i
            else:
                dp[i][j] = dp[i - 1][j]
                flag[i][j] = flag[i - 1][j]
        else:
            dp[i][j] = dp[i - 1][j]
            flag[i][j] = flag[i - 1][j]
ans = dp[N][W]

# 追踪解方案
sol = [0] * N
while flag[N][W] != 0:
    N = flag[N][W]
    sol[N - 1] = 1
    W -= w[N]
    while flag[N][W] == N:
        W = W - w[N]
        sol[N - 1] += 1

# 输出结果
print(f"最大价值为:{ans}")
print(f"取得最大价值时的物品组合为:{sol}")

结果

最大价值为:19
取得最大价值时的物品组合为:[0, 0, 2, 1]

多重背包问题

多重背包问题Bounded Knapsack Problem)是背包问题的一种变种。其问题描述为:给定一个固定大小、能够携重 W W W 的背包,以及 N N N 个价值、重量分别为 v i v_i vi w i w_i wi 的物品,每种物品有 n i n_i ni 件,可以选择放多少件或不放,找出一个最佳解决方案,使得装入背包的物品总重量不超过 W W W,且总价值最大。

有一个容量为 25 25 25 的背包,现有 4 4 4 个物品,其价值、重量、数量分别为:

物品1234
价值1359
重量2347
数量5432

求背包能装下的最大价值以及取得最大价值时的物品组合。

N = 4  # 物品数量
W = 25  # 背包容量
v = [0, 1, 3, 5, 9]  # 物品价值
w = [0, 2, 3, 4, 7]  # 物品重量
n = [0, 5, 4, 3, 2]  # 物品数量
dp = [[0] * (W + 1) for _ in range(N + 1)]  # dp[i][j] 表示前 i 个物品放入容量为 j 的背包的最大价值
flag = [
    [0] * (W + 1) for _ in range(N + 1)
]  # flag[i][j] 表示前 i 个物品放入容量为 j 的背包最大价值时装入物品的最大编号

# dp 求解最大价值并更新 flag
for i in range(1, N + 1):
    for j in range(1, W + 1):
        for k in range(min(n[i], j // w[i]) + 1):
            if dp[i][j] < dp[i - 1][j - k * w[i]] + k * v[i]:
                dp[i][j] = dp[i - 1][j - k * w[i]] + k * v[i]
                flag[i][j] = k
ans = dp[N][W]

# 追踪解方案
sol = [0] * N
j = W
for i in range(N, 0, -1):
    sol[i - 1] = flag[i][j]
    j -= flag[i][j] * w[i]
# 输出结果
print(f"最大价值为:{ans}")
print(f"取得最大价值时的物品组合为:{sol}")

结果

最大价值为:31
取得最大价值时的物品组合为:[0, 1, 2, 2]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL阶段DAY20(附笔记)

【注意】&#xff1a;工厂模式学习知识结构如下&#xff1a; &#xff08;一&#xff09;、单例模式 1.Single类&#xff1a; 使用懒汉式&#xff1a;对象的延迟加载&#xff0c;安全的&#xff0c;高效的应用 双重判断提升效率和安全性 package singleton;/** 单例设计模式之…

Prisma 国内镜像设置

背景 相信大家在体验完 prisma 后&#xff0c;一般都是会感觉开发起来很方便&#xff0c;功能使用起来很顺畅很爽&#xff0c;但是想推广起来团队内使用的时候发现。。。 原因是prisma client 需要下载几个引擎&#xff0c;在其他没有翻墙工具的小伙伴使用的时候发现一直下不下…

供应商管理解决方案实战指南:打造高效供应链

在现代商业环境中&#xff0c;供应商管理是企业成功运营的关键因素之一。随着全球化和供应链的复杂性不断增加&#xff0c;供应商管理面临着许多挑战&#xff0c;如供应商选择、供应商绩效评估和供应链风险管理等。为了解决这些挑战&#xff0c;企业需要采取一系列的解决方案&a…

Sui x KuCoin Labs夏季黑客松第四批入围项目公布

自Sui x KuCoin Labs夏季黑客松开放注册以来&#xff0c;收获了众多开发者的关注和报名参与。现在比赛的报名阶段已结束&#xff0c;截至目前为止&#xff0c;我们已经公布了三批入围项目名单&#xff0c;现在第四批入围名单项目新鲜出炉&#xff0c;最后一轮入围结果将于7月12…

十、HTML中的浮动

1、浮动 1、浮动 块级元素 独占一行 若块级元素宽度较少时&#xff0c;导致后续是空白 布局 先整体&#xff0c;后局部 先简单&#xff0c;再复杂 复杂再划分 整体布局 局部 2、float属性 浮动飘 float属性 让网页元素按照标准文档流方式显示 自上到下&#xff0c;…

19.内部温度传感器

1.STM32内部温度传感器介绍&#xff1a; 内部温度传感器支持的温度范围为&#xff1a;-40~125度&#xff0c;精度为1.5℃左右&#xff1b;T(℃){(V25-Vsense)/Avg_Slope}25;STM32的内部温度传感器是直接连接在ADC内部输入通道&#xff0c;在ADC1通道16连接的内部温度传感器&am…

Django基础入门⑬:Cookie和Session详讲和Django HTML表单实战讲解

Django基础入门⑫&#xff1a;Django 对象查询详解&#xff0c;分组聚合 Cookie和SessionCookie简述Session使用Session的定义理解Session的作用 Session配置Session的基本操作Session在settings.py中的配置Cookie和Session的区别 Django HTML表单实战HTML表单实现用户的登录实…

基于混沌集成决策树的电能质量复合扰动识别(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序参考《基于混沌集成决策树的电能质量复合扰动识别》&#xff0c;主要做的是S变换电能质量扰动识别&#xff0c;通过S变换对电能质量扰动&#xff08;谐波&#xff0c;闪变&#xff0c;暂升等单一扰动和…

15 | 边界:微服务的各种边界在架构演进中的作用?

目录 演进式架构 微服务还是小单体&#xff1f; 微服务边界的作用 逻辑边界 物理边界 代码边界 正确理解微服务的边界 总结 那重点落到边界的时候&#xff0c;总结一下就是&#xff0c;微服务的设计要涉及到逻辑边界、物理边界和代码边界等等。 那么这些边界在微服务架…

vue清除地址栏参数(可以单个,可以多个)

需求 vue跳转新页面后&#xff0c;清除url里面的参数&#xff0c;就是上一个页面带过来的参数&#xff0c;只用一次 mounted () {this.$nextTick(() > {let url this.getnewurl()window.history.replaceState(null, null, url);})},methods: { //根据参数名去清除&#xf…

深度学习训练营之调用Gensim来训练Word2Vec模型

深度学习训练营之调用Gensim来训练Word2Vec模型 原文链接环境介绍前置工作下载Gensim库对于原始语料进行分词添加停用词 模型训练模型介绍模型正式训练 计算词频 原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#…

C#:了解LINQ,简化数据查询和操作的强大工具

文章目录 linq关键字fromwhereselectorderbyjoingroupletinto linq方法筛选方法WhereOfType 排序方法&#xff1a;OrderByOrderByDescendingThenByThenByDescending 投影方法&#xff1a;SelectSelectMany 分组方法&#xff1a;GroupBy 连接方法&#xff1a;JoinGroupJoin 聚合…

高效方案:30万条数据插入 MySQL 仅需13秒

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证 实体类、mapper和配置文件定义 User实体 mapper接口 mapper.xml文件 jdbc.properties sqlMapConfig.xml 不分批次直接梭哈 循环逐条插入 MyBatis实现插入30万条数据 J…

SpringBoot 集成 MybatisPlus 一——介绍

MybatisPlus 是 Mybatis 的升级版本&#xff0c;是对 Mybatis 的简化&#xff0c;因为他们的口号就是“为简化开发而生”。 1、创建数据表 CREATE TABLE ​​User​​ ( ​​id​​ INT NOT NULL, ​​username​​ VARCHAR(50) NULL DEFAULT NULL, ​​gendar​​ CHAR(2) NU…

了解微服务架构

微服务架构 软件架构历史 Software As A Service&#xff0c;这不仅仅是⼀个理念&#xff0c;它更多释放的是企业在新⼀轮的市场竞争中&#xff0c;如何使⽤轻量级的组织架构和新的软件架构来更好的服务企业⾯向未来的战略调整和市场定位&#xff0c;从⽽赢得未来的市场空间。…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 6 日论文合集)

文章目录 一、分割|语义相关(15篇)1.1 Prompting Diffusion Representations for Cross-Domain Semantic Segmentation1.2 ZJU ReLER Submission for EPIC-KITCHEN Challenge 2023: Semi-Supervised Video Object Segmentation1.3 Multi-Modal Prototypes for Open-Set Semanti…

基于YOLO的3D人脸关键点检测方案

目录 前言一、任务列表二、3D人脸关键点数据H3WB2.下载方法3.任务4.评估5.使用许可 3DFAWAFLW2000-3D 三、3D关键点的Z维度信息1.基于3DMM模型的方法2.H3WB 四、当前SOTA的方法1.方法1 五、我们的解决方法1.数据转为YOLO格式2.修改YOLO8Pose的入口出口3.开始训练&#xff0c;并…

aardio 的addHeaders请求

aardio群 625494397 废话不多说 直接开干&#xff01; import web.json; import console; import inet.whttp; web.json.parse( json );//转化json格式 h.addHeaders {Accept-Encoding gzip, deflate, br;Accept-Language zh-CN,zh;q0.9;User-Agent Mozilla/5.0 (Windows …

浅谈智能照明控制管理系统的功能介绍

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;智能照明控制系统较好地实现了智能控制、人性化照明和节能降耗的功能,使其在楼宇控制领域变得越来越重要,越来越受到人们的重视。本文介绍了智能照明控制系统的概念、特点、优势、发展方向等内容,并着重对智能照明控制…

多个项目的进度管理:掌握这3点,轻松应对

在现代的企业竞争中&#xff0c;许多企业组织都会同时进行多个项目。而有效的进度管理对于确保项目按时交付和优化资源利用至关重要。那么有哪些方法可以帮助项目管理者掌握多个项目的进度管理呢&#xff1f; 一&#xff1a;明确目标和优先级 在管理多个项目时&#xff0c;明确…