贪心算法背包问题c

news2024/11/23 15:16:10

在背包问题中,贪心算法通常用来解决0-1背包问题,也就是每种物品都有固定数量,你可以选择拿或者不拿,但不可以拿走部分。以下是一个用C语言实现的贪心算法的例子:

  1. #include <stdio.h>
  2. #define MAX_N 1000
  3. #define MAX_W 100000
  4. int n, W;
  5. int w[MAX_N], v[MAX_N], s[MAX_N];
  6. int f[MAX_N][MAX_W];
  7. int max(int a, int b) {
  8.     return a > b ? a : b;
  9. }
  10. int min(int a, int b) {
  11.     return a < b ? a : b;
  12. }
  13. int main() {
  14.     scanf("%d %d", &n, &W);
  15.     for (int i = 0; i < n; i++) {
  16.         scanf("%d %d %d", &w[i], &v[i], &s[i]);
  17.     }
  18.     for (int i = 0; i < n; i++) {
  19.         for (int j = W; j >= w[i]; j--) {
  20.             f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i]);
  21.         }
  22.     }
  23.     printf("%d\n", f[n - 1][W]);
  24.     return 0;
  25. }

在这个例子中,输入包括物品的数量n和背包的总容量W,然后是每个物品的重量w[i],价值v[i]和数量s[i]。在这个版本的背包问题中,每个物品可以取多次。f[i][j]表示在容量为j的背包中,前i个物品能够获得的最大价值。程序最后输出的是在给定背包容量下,所有物品的最大价值。

背包问题的贪心算法主要是针对0-1背包问题,即每种物品都有固定数量,可以选择拿或者不拿,但不可以拿走部分。贪心算法的策略是在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的。

在背包问题中,我们通常用动态规划来求解。在上述代码中,我们用f[i][j]表示前i个物品在容量为j的背包中能够获得的最大价值。初始状态是f[0][j] = 0,表示不取任何物品时的价值为0。然后我们依次考虑每个物品,对于每个物品,我们都尝试放入背包中,并更新f[i][j]。

对于每个物品i,我们从背包容量W开始考虑,逐步减小背包容量,直到背包容量小于物品i的重量。在这个过程中,我们希望找到一个最小的背包容量,使得放入物品i后能够获得最大的价值。这个最小的背包容量就是f[i - 1][j - w[i]],表示前i - 1个物品在容量为j - w[i]的背包中能够获得的最大价值。如果我们将物品i放入容量为j - w[i]的背包中,那么这个背包的容量就增加了w[i],所以能够获得的最大价值就是f[i - 1][j - w[i]] + v[i]。

因此,我们可以得到状态转移方程:f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i])。这个状态转移方程表示,对于前i个物品在容量为j的背包中能够获得的最大价值f[i][j],要么是前i个物品在容量为j的背包中能够获得的最大价值f[i][j],要么是前i - 1个物品在容量为j - w[i]的背包中能够获得的最大价值f[i - 1][j - w[i]] + v[i]。

最后,输出f[n - 1][W],表示前n个物品在容量为W的背包中能够获得的最大价值。

除了上述的贪心算法外,还有一种称为“完全背包”的贪心算法,适用于物品数量不固定的情况。

在完全背包问题中,每种物品的数量是无限的,可以选择拿或者不拿,但不可以拿走部分。以下是一个用C语言实现的完全背包问题的贪心算法:

  1. #include <stdio.h>
  2. #define MAX_N 1000
  3. #define MAX_W 100000
  4. int n, W;
  5. int w[MAX_N], v[MAX_N];
  6. int f[MAX_N][MAX_W];
  7. int max(int a, int b) {
  8.     return a > b ? a : b;
  9. }
  10. int min(int a, int b) {
  11.     return a < b ? a : b;
  12. }
  13. int main() {
  14.     scanf("%d %d", &n, &W);
  15.     for (int i = 0; i < n; i++) {
  16.         scanf("%d %d", &w[i], &v[i]);
  17.     }
  18.     for (int i = 0; i < n; i++) {
  19.         for (int j = w[i]; j <= W; j++) {
  20.             f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i]);
  21.         }
  22.     }
  23.     printf("%d\n", f[n - 1][W]);
  24.     return 0;
  25. }

在这个例子中,输入包括物品的数量n和背包的总容量W,然后是每个物品的重量w[i]和价值v[i]。在这个版本的背包问题中,每种物品的数量是无限的,可以选择拿或者不拿,但不可以拿走部分。我们用f[i][j]表示前i个物品在容量为j的背包中能够获得的最大价值。程序最后输出的是在给定背包容量下,所有物品的最大价值。

在完全背包问题中,由于每种物品的数量是无限的,所以可以将每个物品看作是一个整体,而不必考虑其数量。因此,我们可以将每个物品的重量和价值看作是其整体的“单位重量”和“单位价值”。

在贪心算法中,我们采取的策略是在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的。因此,我们可以将每个物品的单位价值除以单位重量得到一个“性价比”,然后按照性价比从高到低的顺序依次考虑每个物品。

具体实现时,我们可以先计算每个物品的单位重量和单位价值,然后按照单位价值的降序排列每个物品。对于每个物品,我们可以依次将其加入背包中,并更新背包的容量和价值。这个过程中需要用到一个二维数组f[i][j],表示前i个物品在容量为j的背包中能够获得的最大价值。

状态转移方程与上面的背包问题类似,可以用以下公式表示:

f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i])其中w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。

最后输出f[n - 1][W],表示前n个物品在容量为W的背包中能够获得的最大价值。

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

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

相关文章

卷王开启验证码后无法登陆问题解决

问题描述 使用 docker 部署&#xff0c;后台设置开启验证&#xff0c;重启服务器之后&#xff0c;docker重启&#xff0c;再次访问系统&#xff0c;验证码获取失败&#xff0c;导致无法进行验证&#xff0c;也就无法登陆系统。 如果不了解卷王的&#xff0c;可以去官网看下。…

从零开始搭建企业管理系统(三):集成 Spring Data Jpa

集成 Spring Data Jpa 什么是 Jpa什么是 Spring Data Jpa什么是 HibernateJPA、Spring Data Jpa、Hibernate 之间的关系集成 Spring Data JpaPOM 依赖配置文件UserEntity启动程序Jpa 配置Jpa 注解UserRepositoryUserServiceUserServiceImplUserControllerBaseEntity 什么是 Jpa…

.NET Core 依赖注入 Microsoft.Extensions.DependencyInjection

文章目录 前言什么是依赖注入C# 使用依赖注入框架介绍 Microsoft.Extensions.DependencyInjectionNuget安装简单单例使用打印结果 自动装配举例自动装配测试用例打印结果自动装配执行顺序测试用例有歧义构造函数渐进式构造函数循环依赖 自动装配结论 手动装配手动注入别名注入 …

ShardingSphere数据分片之分表操作

1、概述 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。 Apache ShardingSphere 设计哲学为 Database Plus&#xff0c;旨在构建异构数据库上…

L1-030:一帮一

题目描述 “一帮一学习小组”是中小学中常见的学习组织方式&#xff0c;老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作&#xff0c;即在得到全班学生的排名后&#xff0c;在当前尚未分组的学生中&#xff0c;将名次最…

使用Postman进行自动化集成测试

1 前言 笔者在使用Node开发HTTP接口的过程中&#xff0c;发现当接口数量越来越多&#xff0c;且接口之间互相依赖时&#xff0c;接口测试流程就会变得十分繁琐&#xff0c;且容易出错。那如何才能高效且全面地对接口进行测试呢&#xff1f; 通过实践&#xff0c;笔者发现可以…

程序员的职业连续性就那么重要吗?

大家好&#xff0c;我是风筝&#xff0c;微信搜「古时的风筝」&#xff0c;更多干货 年初的时候时候一个同学跟我聊天说起最近面试的经历。说投了不少简历&#xff0c;但是面试的机会不多&#xff0c;而且有的负责照片的 HR 直接跟他说&#xff1a;“你的工作连续性不达标&…

AI专题报告:AI多模态提升商业化价值,应用多点开花验证景气度

今天分享的AI系列深度研究报告&#xff1a;《AI专题报告&#xff1a;AI多模态提升商业化价值&#xff0c;应用多点开花验证景气度》。 &#xff08;报告出品方&#xff1a;太平洋证券&#xff09; 报告共计&#xff1a;21页 1 一周行情回顾 上周上证综指、深证成指、创业板指…

两个月软考-高项上岸

文章目录 前言结缘软考功亏一篑有始有终2个月计划资料部分计划截图 总结 前言 我们看小说或者电视剧电影都会看到这样的情节&#xff0c;主角一开始锦衣玉食&#xff0c;突然家道中落&#xff0c;啥都没了&#xff0c;主角再一路奋起重新找回了属于自己的一切&#xff1b;还有…

视频汇聚/音视频流媒体视频平台/视频监控EasyCVR分享页面无法播放,该如何解决?

国标GB28181安防视频监控/视频集中存储/云存储EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统…

数据库系统概论期末经典大题讲解(范式提升、求闭包、求主码)

上一次我们介绍了数据库中关系代数查询&#xff0c;从选择、投影到连接等操作符&#xff0c;探索了数据库查询 大家可以移步我的文章&#xff1a;数据库系统概论期末经典大题讲解&#xff08;用关系代数进行查询&#xff09;-CSDN博客 今天&#xff0c;我们将继续沿着数据库系统…

111.am40刷机折腾记4-firefly镜像-dp正常显示

1. 平台&#xff1a; rk3399 am40 4g32g 2. 内核&#xff1a;firefly的内核&#xff08;整体镜像&#xff09; 版本&#xff1a; linux4.4.194 3. 交叉编译工具 &#xff1a;暂时不编译 4. 宿主机&#xff1a;ubuntu18.04 5. 需要的素材和资料&#xff1a;boot-am40-202…

14、SQL注入——HTTP文件头注入

文章目录 一、HTTP Header概述1.1 HTTP工作原理1.2 HTTP报文类型1.3 较重要的HTTP Header内容 二、HTTP Header注入2.1 HTTP Header注入的前提条件2.2 常见的HTTP Header注入类型 一、HTTP Header概述 1.1 HTTP工作原理 1.2 HTTP报文类型 &#xff08;1&#xff09;请求报文 …

CrystalDiskInfo中文版(硬盘检测工具) v9.1.1.0 绿色汉化版-供大家学习研究参考

更新内容 重新支持三星SATA SSD寿命报告 增加对ZHITAI SC001的支持 新增SK hynix Gold S31支持 增加了KLEVV NEO N610的支持。 改进的Micron/Crucial SATA SSD支持 已更改 卸载程序将显示一个确认对话框&#xff0c;用于删除设置。 强大功能 1.拥有多国语言&#xff0c;…

element中el-select多选v-model是对象数组

文章目录 一、问题二、解决三、最后 一、问题 element中的el-select的v-model一般都是字符串或者字符串数组&#xff0c;但是有些时候后端接口要求该字段要传对象或者对象数组&#xff0c;如果再转换一次数据&#xff0c;对于保存配置和回显都是吃力不讨好的事情。如下所示&am…

Linux--学习记录(2)

解压命令&#xff1a; gzip命令&#xff1a; 参数&#xff1a; -k&#xff1a;待压缩的文件会保留下来&#xff0c;生成一个新的压缩文件-d&#xff1a;解压压缩文件语法&#xff1a; gzip -k pathname(待压缩的文件夹名)gzip -kd name.gz&#xff08;待解压的压缩包名&#x…

数据库版本管理框架-Flyway(从入门到精通)

一、flyway简介 Flyway是一个简单开源数据库版本控制器&#xff08;约定大于配置&#xff09;&#xff0c;主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL&#xff08;PL/SQL、T-SQL&#xff09;方式和Java方式&#xff0c;支持命令行客户端等&am…

SpringIOC之@Configuration

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…