背包问题---怎么选取物品,可以使得背包装的物品价值最大?

news2024/11/26 13:39:53

原文:

https://zhuanlan.zhihu.com/p/567560364

1)0-1背包问题的描述

现在有四种物品,每种物品只有1件,它们的重量与价值如下表。

现在有一个背包,总容量为8。问怎么选取物品,可以使得背包装的物品价值最大?

物品编号物品重量物品价值物品数量
1231
2341
3451
4581

(2)多重背包问题的描述

现在有四种物品,每种物品有若干件,它们的重量与价值如下表。

现在有一个背包,总容量为8。问怎么选取物品,可以使得背包装的物品价值最大?

物品编号物品重量物品价值物品数量
1232
2342
3452
4582

(3)完全背包问题的描述

现在有四种物品,每种物品有无数件,它们的重量与价值如下表。

现在有一个背包,总容量为8。问怎么选取物品,可以使得背包装的物品价值最大?

物品编号物品重量物品价值物品数量
123无数件
234无数件
345无数件
458无数件

一、0-1背包问题

一、0-1背包问题

思路:对于每件物品,由于是不可分割的放入,所以,就有两种情况:该物品放入背包与该物品不放入背包;为了将以上问题求解出来,我们需要设置好状态以及状态转移方程。

(1)定义状态

DP[k][w]:表示当背包剩余容量为w,现在有前k件物品可放的情况下,背包所能装物品的最大价值。

那么,状态确定好了,上面所描述的题目中,只要求出DP[4][8]就可以了。

DP[k][w]怎么求呢,这就是状态转移方程的问题。

(2)状态转移方程

我们先将状态转移方程写出来吧,就是:

DP[k][w] 等于下列两种情况:

①DP[k][w]=DP[k-1][w],当第k件物品的重量大于w时

②DP[k][w]=max(DP[k-1][w],DP[k-1][w-wi]),当第k件物品的重量不大于w时

#include <stdio.h>

#define N 10010
#define V 10010
#define MAX(a,b) ((a) > (b) ? (a) : (b))

int dp[N][V];
int n, v;       //n:物品数量,v:背包实际容量 
int weight[N];   //第n件物品的重量 
int value[N];    //第n件物品的价值 

void knap_01()
{
    for (int i = 1;i <= n; i++)
        for (int j = 1; j <= v; j++) {
            if (weight[i] > j) {
                dp[i][j] = dp[i-1][j];
            } else {
                dp[i][j] = MAX(dp[i - 1][j - weight[i]] + value[i], dp[i - 1][j]);
            }
    }
}

int main()
{
    scanf("%d %d", &n, &v);
    for(int i = 1;i <= n; i++) {
        scanf("%d", &weight[i]);
    }

    for(int i = 1;i <= n; i++) {
        scanf("%d", &value[i]);
    }

    knap_01();
    printf("dp[%d][%d]=%d\n", n, v, dp[n][v]);

    return 0;
}

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

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

相关文章

C#,《小白学程序》第二十三课:大数的除法(BigInteger Divide)

1 文本格式 /// <summary> /// 比较a&#xff0c;b的大小&#xff0c;返回1&#xff0c;0&#xff0c;-1 /// 数据从低位&#xff08;右&#xff09;往高位&#xff08;左&#xff09;存储; /// </summary> /// <param name"a"></param> ///…

Linux(下)

一、 对netstat的补充 1.进程管理 在杀死进程时&#xff0c;不可以杀死其他用户的进程。 查看指定进程时&#xff0c;下图的第二行 是ps -ef | grep tail 命令执行的进程 kill -9 进程号 也可以写作 kill -s 9 进程号 机器人&#xff1a; 2.查看主机状态 将进程的信息分三…

使用新版Maven-mvnd快速构建项目

目前我们项目的构建方式多数是 maven、gradle&#xff0c;但是 maven 相对 gradle 来说&#xff0c;构建速度较慢&#xff0c;特别是模块相对较多的时候&#xff0c;构建速度更加明显。但是我们将项目由 maven 替换为 gradle 相对来说会比较麻烦&#xff0c;成本较高。于是我们…

文章生成器免费版

你是否曾经陷入文案创作的困扰中&#xff1f;是不是为了撰写出优质的文章而煞费苦心&#xff1f;那么&#xff0c;如果我告诉你&#xff0c;现在有一种神奇的工具&#xff0c;可以为你解决这个问题&#xff0c;让你轻松地生成文章&#xff0c;你会不会感到兴奋呢&#xff1f;让…

惊艳时装界!AIGC风暴来袭,从设计到生产的全新体验

时尚是一个不断演进的领域&#xff0c;充满创新和独创性&#xff0c;但现在&#xff0c;创新迈入了一个崭新的境界——人工智能生成内容&#xff08;AIGC&#xff09;。这个革命性的技术&#xff0c;改变了时装设计的游戏规则。在过去的几年里&#xff0c;人工智能已经深刻地改…

关于时空数据的培训 GAN:实用指南(第 02/3 部分)

一、说明 在本系列关于训练 GAN 实用指南的第 1 部分中&#xff0c;我们讨论了 a&#xff09; 鉴别器 &#xff08;D&#xff09; 和生成器 &#xff08;G&#xff09; 训练之间的不平衡如何导致模式崩溃和由于梯度消失而导致静音学习&#xff0c;以及 b&#xff09; GAN 对超参…

C 编译原理

C 编译原理 目录 C 编译原理引入GCC 工具链介绍C运行库 编译准备工作编译过程1.预处理2.编译3.汇编4.链接 分析ELF文件1.ELF文件的段2.反汇编ELF C语言编译过程 - 摘录编译预处理编译、优化汇编链接过程 引入 大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高…

【80天学习完《深入理解计算机系统》】第十六天 4.2 Y86-64的顺序实现

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Spring Boot的优点及项目创建

Spring Boot优点 起步依赖&#xff08;创建的时候就可以方便的添加依赖&#xff09;内置了Tomcat容器快速部署&#xff0c;使用jar包加上简单的命令直接运行抛弃XML的配置方式提供了更多的监控框架&#xff0c;方便的监控系统运行 Spring Boot项目的创建 准备工作 1.如果ID…

Linux常用命令 - 简单命令

简单命令 who 功能&#xff1a;列出所有正在使用系统的用户相关信息。 who who am i whoamidate 功能&#xff1a;显示或者设置系统的日期和时间。 date date -s 12:3:3cal 功能&#xff1a;显示日历。 cal cal 2023 cal 9 2023clear 功能&#xff1a;清除屏幕上的信息…

浙工大MBA常规批复试建议怎么准备?

如果你第一志愿报考浙江工业大学MBA项目不想被无故的淘汰&#xff0c;小编建议你还是认真对待考后的复试环节。因为从2023年的招生录取可以看到&#xff0c;浙工大MBA项目的提前批面试对于最终录取几乎是没什么作用的&#xff0c;在与普通考生同层次竞争的局面下&#xff0c;复…

高压放大器的特点及应用领域有哪些

高压放大器是一种用于增强输入信号的电压的设备&#xff0c;具有许多独特的特点和广泛的应用领域。下面西安安泰将详细介绍高压放大器的特点以及其在各个领域的应用。 高压放大器的特点&#xff1a; 高增益&#xff1a;高压放大器能够提供高增益&#xff0c;即输入信号经过放大…

redis深度历险 1 - Redis基础数据结构-001

Redis有5种基础数据结构&#xff0c;分别为: string (字符串)、list(列表)、set (集合)、hash (哈希&#xff09;和zset (有序集合)。熟练掌握这5种基本数据结构的使用是Redis 知识最基础也最重要的部分&#xff0c;它也是在 Redis面试题中问到最多的内容。 1 字符串 string …

css实现内凹圆

css实现内凹圆 实现效果 html <div id"post-form"><div class"formbox"></div><div class"rightform"></div> </div>css 样式 #post-form{padding:50px 10px;background:#fff;margin:30px auto;width:9…

vue3+element-plus权限控制实现(el-tree父子级不关联情况处理)

文章目录 前言一、遇到的交互场景el-tree 中 check-strictly 属性 二、处理父级的半选中以及选中交互el-treecheck&#xff0c;check-change 事件编辑进来&#xff0c;父级的半选状态处理 总结 前言 在开发后台管理系统的时候&#xff0c;用户的权限控制是一个常见的需求。这里…

NLP中的文本分类、实体识别、关系识别和三元组识别

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本分类、实体识别、关系识别和三元组识别是重要的主题。本文将深入探讨这些关键问题&#xff0c;并介绍相关算法和技术。 文本分类 首先&#xff0c;我们关注文本分类。不同的文本分类算法和技术被详细介绍&…

事务隔离级别是怎么实现的?

事务有哪些特性&#xff1f; 事务是由 MySQL 的引擎实现的&#xff0c;我们常见的 InnoDB引擎时支持事务的。 不过并不是所有的引擎都支持事务&#xff0c;比如 MySQL原生的 MyISAM 引擎就不支持事务&#xff0c;正因为如此&#xff0c;大多数MySQL的引擎都是用 InnoDB。 事…

Docker进阶:Docker轻量级可视化工具Portainer与容器监控3剑客CAdvisor+InfluxDB+Granfana

Docker进阶&#xff1a;Docker轻量级可视化工具Portainer与容器监控3剑客CAdvisorInfluxDBGranfana 一、Docker轻量级可视化工具Portainer1.1、Portainer简介1.2、安装Portainer1.2.1、安装Portainer的Docker镜像1.2.2、访问Portainer Web界面1.2.3、连接到Docker守护进程 1.3、…

SpringBoot整合Zookeeper做分布式锁

环境准备 zookeeper准备 首先你需要一个zookeeper服务器&#xff0c;或者是一个zookeeper集群。我已经准备好了一个zookeeper集群&#xff0c;如图&#xff1a; 当然一个单节点的zookeeper也可以搭建分布式锁。如果你还没有zookeeper&#xff0c;那么你可以参考我写的搭建z…

华为云云耀云服务器L实例评测|轻量级应用服务器对决:基于 Geekbench 深度测评华为云云耀云服务器L实例

本文收录在专栏&#xff1a;#云计算入门与实践 - 华为云 专栏中&#xff0c;本系列博文还在更新中 相关华为云云耀云服务器L实例评测文章列表如下&#xff1a; 华为云云耀云服务器L实例评测 | 从零开始&#xff1a;云耀云服务器L实例的全面使用解析指南 华为云云耀云服务器L实…