贪心算法(基础)
目录
一、什么是贪心?
(一)以教室调度问题为例
1. 问题
2. 具体做法如下
3. 因此将在这间教室上如下三堂课
4. 结论
(二)贪心算法介绍
1. 贪心算法一般解题步骤
二、最优装载问题
(一)问题
(二)分析
(三) 核心代码
(四)完整代码
三、完全背包问题
(一)问题
(二)分析
(三)举例
(四)核心代码
(五)完整代码
(六)物品类的完整代码
一、什么是贪心?
(一)以教室调度问题为例
1. 问题
- 假设有如下课程表,你希望将尽可能多的课程安排在某一间教室上
2. 具体做法如下
- 第一步:选出结束最早的课,它就是要在这间教室上的第一堂课
- 第二步:接下来,必须选择第一堂课结束后才开始的课。同样,选择开始最早的课,这将是要在这间教室上的第二堂课
3. 因此将在这间教室上如下三堂课
4. 结论
- 这道题就采取的贪心算法===>每步都采取最优的做法
(二)贪心算法介绍
- 贪心算法又称贪婪算法,是指在对问题求解时,总是做出当前看来最好的选择,它不是从整体上加以考虑,所做出的仅是在某种意义上的局部最优解。而局部的最优解叠加在一起便是该问题整体的最优解,或者近似最优解。
1. 贪心算法一般解题步骤
- 将问题分解为若干个子问题
- 找出合适的贪心策略
- 求解每一个子问题的最优解
- 将局部最优解堆叠成全局最优解
二、最优装载问题
(一)问题
- 有一艘海盗船,载重量为C,每一件古董的重量为,海盗们如何尽可能的把多数量的宝贝装上海盗船 ?
(二)分析
- 当载重量为定值的时候,越小时,可装载的古董数量n越大,只要依次选择最小重量的古董即可
- 把n个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选出前i个古董,直到不能继续装为止
(三) 核心代码
template<typename T1,typename T2,typename T3>
void Loading(T1 c, vector<T2>& w, vector<T3>& t, vector<bool>& v)
{//冒泡排序for (int i = w.size() - 1; i > 0; i--)//扫描次数{for (int j = 0; j < i; j++){if (w[j] > w[j + 1]){swap(w[j], w[j + 1]);//交换物品重量swap(t[j], t[j + 1]);//交换物品的序号}}}for (int k = 0; w[k] <= c; k++){v[k] = true;c = c - w[k];//船的剩余装载量}
}
(四)完整代码
#include<iostream>
#include<vector>
#include<stdbool.h>
using namespace std;
template<typename T1,typename T2,typename T3>
void Loading(T1 c, vector<T2>& w, vector<T3>& t, vector<bool>& v)
{//冒泡排序for (int i = w.size() - 1; i > 0; i--)//扫描次数{for (int j = 0; j < i; j++){if (w[j] > w[j + 1]){swap(w[j], w[j + 1]);//交换物品重量swap(t[j], t[j + 1]);//交换物品的序号}}}for (int k = 0; w[k] <= c; k++){v[k] = true;c = c - w[k];//船的剩余装载量}
}
int main()
{float c;//表示船的最大载重和物品个数int n;//物品个数cout << "请依次输入船的最大载重和物品个数:" << endl;cin >> c >> n;vector<float> w(n);//存放物品的重量vector<int> t(n);;//存放物品的下标vector<bool> v(n);//记录物品是否装入船中cout << "请依次输入物品重量:" << endl;for (int i = 0; i < n; i++)//初始化物品信息{cin >> w[i];t[i] = i;v[i] = false;}Loading(c,w,t,v);cout << "装入了:" << endl;for (int i = 0; i < w.size(); i++)//输出装入的物品{if (v[i] == true)cout << t[i] << "号物品," << "重量为:" << w[i] << endl;}return 0;
}
//测试数据
//30 8
//4 10.5 7.8 4.9 5.1 3.3 4.6 3.2//结果
//装入了:
//7号物品,重量为:3.2
//5号物品,重量为:3.3
//0号物品,重量为:4
//6号物品,重量为:4.6
//3号物品,重量为:4.9
//4号物品,重量为:5.1
三、完全背包问题
(一)问题
- 有n件物品,每件物品有一定的重量w和相应的价值v,背包的最大容量为bagW,一种物品只能拿一样(不可重复拿),物品可以分割,求解将哪些物品装入背包里物品价值总和最大?
(二)分析
- 依照贪心策略,每次选取单位重量价值最大的物品,也就是说每次选择性价比(价值/重量)最高的物品,如果达到运载重量bagW,那么一定能得到价值最大
(三)举例
背包最大容量为30,在依次选择物品2、10、6、3、5后,背包最大价值达到69,背包剩余容量为,只能装8号物品的,此时背包最大价值为
(四)核心代码
void CompletePack(int _bagW,int n,struct goods*ps)
{double sum = 0;//背包总价值for (int i = 0;i<n; i++){if (_bagW >ps[i].w)//背包容量大于物品重量{ps[i].c = 1;sum =sum+ ps[i].v;_bagW = _bagW - ps[i].w;//剩余背包容量}else//背包容量小于物品重量{ps[i].c = (double)_bagW / (double)ps[i].w;//装入物品的比例(必须要强制转换)sum =sum+ps[i].c *ps[i].v;break;}}cout << "背包最大价值:" << sum << endl;
}
(五)完整代码
#include<iostream>
#include<algorithm>
#include<iomanip>//setw的头文件
using namespace std;
#define MAX 100//物品数量最多为100
struct goods
{int n;//物品编号int w;//物品重量int v;//物品价值double p;//物品性价比double c;//记录装入物品的比例(如果物品完全放入背包,则c=1;不放入,c=0)
}g[MAX];void Init(int n, struct goods*ps);//初始化物品信息
bool cmp(struct goods a,struct goods b);//比较
void CompletePack(int _bagW,int n,struct goods*ps);
void print(int n, struct goods* ps);//遍历void Init(int n, struct goods*ps)//初始化物品信息
{cout << "请依次输入物品的重量和价值:" << endl;for (int i = 0; i < n; i++){ps[i].n = i;//物品编号cin >>ps[i].w >> ps[i].v;//初始化物品重量和价值ps[i].p = (double)ps[i].v / (double)ps[i].w;//性价比ps[i].c = 0;//都没有放入背包}
}bool cmp(struct goods a,struct goods b)//比较
{return a.p > b.p;//根据物品单位价值从大到小排序
}
void CompletePack(int _bagW,int n,struct goods*ps)
{double sum = 0;//背包总价值for (int i = 0;i<n; i++){if (_bagW >ps[i].w)//背包容量大于物品重量{ps[i].c = 1;sum =sum+ ps[i].v;_bagW = _bagW - ps[i].w;//剩余背包容量}else//背包容量小于物品重量{ps[i].c = (double)_bagW / (double)ps[i].w;//装入物品的比例(必须要强制转换)sum =sum+ps[i].c *ps[i].v;break;}}cout << "背包最大价值:" << sum << endl;
}
void print(int n, struct goods* ps)
{for (int i = 0; i < n; i++){if (ps[i].c != 0){if (ps[i].c == 1)cout << "物品" << ps[i].n << setw(20) << "价值为:" << ps[i].v << endl;elsecout << "物品" << ps[i].n << "装入了" << ps[i].c <<setw(8)<< " 价值为:" << ps[i].v << endl;}}
}int main()
{int bagW, n;//背包最大容量和物品数量cout << "请依次输入物品重量和物品数量:" << endl;cin >> bagW >> n;Init(n,g);//初始化物品信息cout << endl<<endl ;sort(g, g + n, cmp);//排序CompletePack(bagW,n, g);print(n, g);return 0;
}//测试数据
// 背包容量30 物品数量10
//4 3
//2 8
//9 18
//5 6
//5 8
//8 20
//5 5
//4 6
//5 7
//5 15//结果
//背包最大价值:70.5
//物品1 价值为:8
//物品9 价值为:15
//物品5 价值为:20
//物品2 价值为:18
//物品4 价值为:8
//物品7装入了0.25 价值为:6
(六)物品类的完整代码
#include<iostream>
#include <iomanip>//setw的头文件
using namespace std;
#define MAX 20//物品数量最多为20
class goods
{
private:int number;//物品编号int weight;//物品重量double value;//物品价值double percentage;//物品性价比double choice;//记录装入物品的比例(如果物品完全放入背包,则choice=1;不放入,choice=0)
public:goods() { ; }goods(int _n,int _w, double _v, double _p, double _c)//构造函数{this->number = _n;this->weight = _w;this->value = _v;this->percentage = _p;this->choice = _c;}//~goods();//析构函数//获取私有成员int getn();//获取私有成员numberint getw();//获取私有成员weightdouble getv();//获取私有成员valuedouble getp();//获取私有成员percentagedouble getc();//获取私有成员choice//修改私有成员void setn(int _n);//修改私有成员的numbervoid setw(int _w);void setv(double _v);void setp(double _p);void setc(double _c);
};int goods::getn()
{return number;
}
int goods::getw()//获取私有成员weight
{return weight;
}
double goods::getv()
{return value;
}
double goods::getp()
{return percentage;
}
double goods::getc()
{return choice;
}void goods::setn(int _n)
{number = _n;
}
void goods::setw(int _w)
{weight = _w;
}
void goods::setv(double _v)
{value = _v;
}
void goods::setp(double _p)
{percentage = _p;
}
void goods::setc(double _c)
{choice = _c;
}
int main()
{int bagW, n;//背包最大容量和物品数量cout << "请依次输入背包容量和物品数量:" << endl;cin >> bagW >> n;//goods *g=new goods[MAX];goods g[MAX];cout << "请依次输入物品重量和物品价值:" << endl;for (int i = 0; i < n; i++){int _n,_w,_c;//物品编号,物品重量,物品是否放入了背包double _v, _p;//物品价值,物品性价比cin >> _w >> _v;_p = _v / _w;//性价比_n = i;//编号_c = 0;//是否放入了背包goods gg(_n, _w, _v, _p, _c);g[i] = gg;}for (int i = 0; i <= n - 1; i++)//简单选择排序(按照性价比从大到小){double max = g[i].getp();int k = i;//保存最大性价比的物品下标for (int j = i; j < n; j++){if (max < g[j].getp()){max = g[j].getp();k = j;}}swap(g[i], g[k]);}double sum = 0;//背包总价值for (int i = 0; i < n; i++){if (bagW > g[i].getw())//背包容量大于物品重量{g[i].setc(1);//物品全部装入背包sum += g[i].getv();//背包价值增加bagW = bagW - g[i].getw();//剩余背包容量}else//背包容量大于物品重量{double x = double(bagW) / double(g[i].getw());g[i].setc(x) ;//装入物品的比例sum += g[i].getc() * g[i].getv();break;}}cout << "物品的最大价值为:" << sum << endl;for (int i = 0; i < n; i++){if (g[i].getc() != 0){if (g[i].getc() == 1)cout << "物品" << g[i].getn() << setw(20) << "价值为:" << g[i].getv() << endl;elsecout << "物品" << g[i].getn() << "装入了" << g[i].getc() <<setw(8)<< " 价值为:" << g[i].getv() << endl;}}return 0;
}//测试数据
//30 10
//4 3
//2 8
//9 18
//5 6
//5 8
//8 20
//5 5
//4 6
//5 7
//5 15//结果
//物品的最大价值为:70.5
//物品1 价值为:8
//物品9 价值为:15
//物品5 价值为:20
//物品2 价值为:18
//物品4 价值为:8
//物品7装入了0.25 价值为:6
相关文章:
贪心算法(基础)
目录 一、什么是贪心? (一)以教室调度问题为例 1. 问题 2. 具体做法如下 3. 因此将在这间教室上如下三堂课 4. 结论 (二)贪心算法介绍 1. 贪心算法一般解题步骤 二、最优装载问题 (一…...
【九宫格坐标排列 Objective-C语言】
一、这个案例做好之后的效果如图: 1.这个下载是可以点击的,当你点击之后,弹出一个框,过一会儿,框框自动消失,这里变成“已安装” 2.那么,我现在先问大家一句话:大家认为在这一个应用里面,它包含几个控件, 3个,哪3个:一个是图片框,一个是Label,一个是按钮, 这…...
Tomcat简介
目录 一、Tomcat简介 二、下载安装Tomcat 三、利用Tomcat部署静态页面 一、Tomcat简介 Tomcat是一个HTTP服务器,可以按照HTTP的格式来解析请求来调用用户指定的相关代码然后按照HTTP的格式来构造返回数据。 二、下载安装Tomcat 进入Tomcat官网选择与自己电脑…...
Python基础及函数解读(深度学习)
一、语句1.加注释单行注释:(1)在代码上面加注释: # 后面跟一个空格(2)在代码后面加注释:和代码相距两个空格, # 后面再跟一个空格多行注释:按住shift 点击三次"&am…...
车道线检测-PolyLaneNet 论文学习笔记
论文:《PolyLaneNet: Lane Estimation via Deep Polynomial Regression》代码:https://github.com/lucastabelini/PolyLaneNet地址:https://arxiv.org/pdf/2004.10924.pdf参考:https://blog.csdn.net/sinat_17456165/article/deta…...
GO——接口(下)
接口接口值警告:一个包含空指针值的接口不是nil接口sort.Interface接口http.Handler接口类型断言类型分支接口值 接口值,由两个部分组成,一个具体的类型和那个类型的值。它们被称为接口的动态类型和动态值。对于像Go语言这种静态类型的语言&…...
计算机网络之http02| HTTPS HTTP1.1的优化
post与get请求的区别 get 是获取资源,Post是向指定URI提交资源,相关信息放在body里 2.http有哪些优点 (1)简单 报文只有报文首部和报文主体,易于理解 (2)灵活易拓展 URI相应码、首部字段都没有…...
基于matlab使用神经网络清除海杂波
一、前言此示例演示如何使用深度学习工具箱™训练和评估卷积神经网络,以消除海上雷达 PPI 图像中的杂波返回。深度学习工具箱提供了一个框架,用于设计和实现具有算法、预训练模型和应用程序的深度神经网络。二、数据集该数据集包含 84 对合成雷达图像。每…...
每天10个前端小知识 【Day 8】
前端面试基础知识题 1. Javascript中如何实现函数缓存?函数缓存有哪些应用场景? 函数缓存,就是将函数运算过的结果进行缓存。本质上就是用空间(缓存存储)换时间(计算过程), 常用于…...
【项目精选】基于Java的敬老院管理系统的设计和实现
本系统主要是针对敬老院工作人员即管理员和员工设计的。敬老院管理系统 将IT技术为养老院提供一个接口便于管理信息,存储老人个人信息和其他信息,查找 和更新信息的养老院档案,节省了员工的劳动时间,大大降低了成本。 其主要功能包括: 系统管理员用户功能介绍&#…...
Spark SQL 介绍
文章目录Spark SQL1、Hive on SparkSQL2、SparkSQL 优点3、SparkSQL 特点1) 容易整合2) 统一的数据访问3) 兼容 Hive4) 标准的数据连接4、DataFrame 是什么5、DataSet 是什么Spark SQL Spark SQL 是 Spark 用于结构化数据(structured data) 处理的Spark模块。 1、Hive on Spa…...
升级到 CDP 后Hive on Tez 性能调整和故障排除指南
优化Hive on Tez查询永远不能以一种万能的方法来完成。查询的性能取决于数据的大小、文件类型、查询设计和查询模式。在性能测试期间,要评估和验证配置参数和任何 SQL 修改。建议在工作负载的性能测试期间一次进行一项更改,并且最好在生产环境中使用它们…...
理解HDFS工作流程与机制,看这篇文章就够了
HDFS(The Hadoop Distributed File System) 是最初由Yahoo提出的分布式文件系统,它主要用来: 1)存储大数据 2)为应用提供大数据高速读取的能力 重点是掌握HDFS的文件读写流程,体会这种机制对整个分布式系统性能提升…...
Intel处理器分页机制
分页模式 Intel 64位处理器支持3种分页模式: 32-bit分页PAE分页IA-32e分页 32-bit分页 32-bit分页模式支持两种页面大小:4KB以及4MB。 4KB页面的线性地址转换 4MB页面的线性地址转换 PAE分页模式 PAE分页模式支持两种页面大小:4KB以及…...
Linux常用命令
linux常用命令创建一个目录mkdir 命令可以创建新目录。mkdir 是 make directory 的缩写。[rootiZ2ze66tzux2otcpbvie88Z ~]# ls [rootiZ2ze66tzux2otcpbvie88Z ~]# mkdir web [rootiZ2ze66tzux2otcpbvie88Z ~]# ls web [rootiZ2ze66tzux2otcpbvie88Z ~]# 创建一个文件2.1 在 Li…...
基于STM32设计的音乐播放器
一、项目背景与设计思路 1.1 项目背景 时代进步,科学技术的不断创新,促进电子产品的不断更迭换代,各种新功能和新技术的电子产品牵引着消费者的眼球。人们生活水平的逐渐提高,对娱乐消费市场需求日益扩大,而其消费电子产品在市场中的占有份额越来越举足轻重。目前消费电…...
微服务开发
目录 微服务配置管理 权限认证 批处理 定时任务 异步 微服务调用 (协议)...
【(C语言)数据结构奋斗100天】二叉树(上)
【(C语言)数据结构奋斗100天】二叉树(上) 🏠个人主页:泡泡牛奶 🌵系列专栏:数据结构奋斗100天 本期所介绍的是二叉树,那么什么是二叉树呢?在知道答案之前,请大家思考一下…...
Java 验证二叉搜索树
验证二叉搜索树中等给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1&…...
C/C++单项选择题标准化考试系统[2023-02-09]
C/C单项选择题标准化考试系统[2023-02-09] ©3.17 单项选择题标准化考试系统 【难度系数】5级 【任务描述】 设计一个单项选择题的考试系统,可实现试题维护、自动组卷等功能。 【功能描述】 (1)管理员功能: 试题管理:每个试题包括题干、四个备选答案标准答案…...
爱了爱了,这些顶级的 Python 工具包太棒了
Python 语言向来以丰富的第三方库而闻名,今天来介绍几个非常nice的库,有趣好玩且强大!推荐好好学习。 文章目录技术交流数据采集AKShareTuShareGoPUPGeneralNewsExtractor爬虫playwright-pythonawesome-python-login-modelDecryptLoginScylla…...
【Explain详解与索引优化最佳实践】
摘要 explain命令是查看MySQL查询优化器如何执行查询的主要方法,可以很好的分析SQL语句的执行情况。每当遇到执行慢(在业务角度)的SQL,都可以使用explain检查SQL的执行情况,并根据explain的结果相应的去调优SQL等。 …...
【树和二叉树】数据结构二叉树和树的概念认识
前言:在之前,我们已经把栈和队列的相关概念以及实现的方法进行了学习,今天我们将认识一个新的知识“树”!!! 目录1.树概念及结构1.1树的概念1.2树的结构1.3树的相关概念1.4 树的表示1.5 树在实际中的运用&a…...
通达信收费接口查询可申购新股c++源码分享
有很多股民在做股票交易时为了实现盈利会借助第三三方炒股工具帮助自己,那么通达信收费接口就是人们常用到的,今天小编来分享一下通达信收费接口查询可申购新股c源码: std::cout << " 查询可申购新股: category 12 \n"; c…...
【C#设计模式】创建型设计模式 (单例,工厂)。
c# 创建型设计模式 1.单例设计模式c# 单例JS 单例(ES6)c# 扩展方法c# 如果窗体非单例(tips:窗口可以容器化)2.工厂设计模式JS 简单工厂(ES6)C# 简单工厂C# params关键词(自定义参数个数)JS 手写JQuery(委托,工厂方式隐藏细节)JS ...四种用法C# 偷懒工厂1.单例设计模式 …...
Ubuntu 22.04 LTS 入门安装配置优化、开发软件安装一条龙
Ubuntu 22.04 LTS 入门安装配置&优化、开发软件安装 例行前言 最近在抉择手上空余的笔记本(X220 i7-2620M,Sk Hynix ddr3 8G*2 ,Samsung MINISATA 256G)拿来运行什么系统比较好,早年间我或许还会去继续使用Win…...
第五十章 动态规划——数位DP模型
第五十章 动态规划——数位DP模型一、什么是数位DP数位DP的识别数位DP的思路二、例题1、AcWing 1083. Windy数(数位DP)2、AcWing 1082. 数字游戏(数位DP)3、AcWing 1081. 度的数量(数位DP)一、什么是数位DP…...
02- pandas 数据库 (机器学习)
pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …...
学Qt想系统的学习,看哪本书?
Qt 是一个跨平台应用开发框架(framework),它是用 C语言写的一套类库。使用 Qt 能为 桌面计算机、服务器、移动设备甚至单片机开发各种应用(application),特别是图形用户界面 (graphical user in…...
2023年网络安全比赛--跨站脚本攻击②中职组(超详细)
一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.访问服务器网站目录1,根据页面信息完成条件,将获取到弹框信息作为flag提交; 2.访问服务器网站目录2,根据页面信息完成条件,将获取到弹框信息作为flag提交; 3.访问服务器网站目录3,根据页面信息完成条件,将获取到弹框信息…...
中国建设银行网站的机构/优化百度seo
一,建立 git 帐户1,在用做服务器的机器 Server 上建立 git 帐户。咱们能够经过 System Preferences->accounts 来添加。在这里我添加一个 git 的 administrator 帐户,administrator 不是必须的,在这里仅仅为了方便。2ÿ…...
网站支持asp/杭州seo技术培训
iOS 获取图片有三种方法: 1. 直接调用摄像头拍照 2. 从相册中选择 3. 从图库中选择 UIImagePickerController 是系统提供的用来获取图片和视频的接口; 用UIImagePickerController 类来获取图片视频,大体分为以下几个步骤: 1. 初始…...
呼叫中心系统怎么收费/郑州seo招聘
1.Python3环境搭建 python 是可应用于多平台的,比如我们常见的:windows,macOs,Linux 无论你在哪个平台,都可以先查看一下自己电脑是否已经安装了python3 windows 用cmd,mac和linux用终端: 输入python 可以看到如下&am…...
做货源的网站/谷歌搜索排名
第一步先下载源码,解压后 ./dist/configure --enable-cxx编译,然后make, make install--enable-cxx To build the Berkeley DB C API, enter --enable-cxx as an argument to configure. 默认的安装路径是: /usr/local/BerkeleyDB.6.1/ 代码如…...
怎么删除wordpress/sem推广优化
后端 uniapp文件上传代码-jeecgboot接收文件上传并返回上传文件的地址代码(本地版)【伸手党福利】 https://blog.csdn.net/wwppp987/article/details/123470369 jeecgboot定时任务示例(解决springboot和jeecgboot框架定时任务突然无效问题…...
网站机房建设/网站查询访问
CentOS 8下默认防火墙FirewallD操作实践 操作环境 自用腾讯云服务器 CentOS Linux release 8.0.1905 (Core) FirewallD 0.6.3 准备工作 了解FirewallD命令使用方法 [rootVM-0-15-centos /]# firewall-cmd -h [rootVM-0-15-centos /]# firewall-cmd --help全部使用方法见本文…...