当前位置: 首页 > article >正文

c++算法学习5——贪心算法

一、贪心算法的原理

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优决策的策略,通过局部最优解的累积逼近全局最优解。其核心思想是“着眼当前,忽略整体”,适用于满足​​最优子结构​​和​​贪心选择性质​​的问题。本文以阿里巴巴运宝藏问题为切入点,深入解析贪心算法的设计步骤、验证方法及经典应用。

二、贪心算法的核心思想

贪心算法需满足三个关键步骤:

  1. ​确定最优子结构​
    问题可分解为多个子问题,且子问题的最优解能组合为全局最优解。例如背包问题中,子问题是“当前剩余容量下的最大价值”。
  2. ​构建贪心选择策略​
    制定局部最优决策规则,常见策略包括:
    • ​分类讨论​​(如区间覆盖问题)
    • ​最值搭配​​(如纪念品分组)
    • ​最大价值优先​​(如金属装载问题)
  3. ​验证策略正确性​
    需通过数学方法证明贪心策略的全局最优性:
    • ​数学归纳法​​:证明每一步选择保持最优解结构。
    • 反证法:假设存在更优解,推导矛盾。
三、经典贪心问题
1.题目:最大价值装载(金属分割问题)

        阿里巴巴此时已经到了强盗们藏宝的宝库,里面有许多珍贵的贵金属,但是他只带着一个口袋,口袋至多只能装重量为w的物品。宝库内的贵金属有s个种类, 每种金属重量不同,分别为n1,n2,...,ns,同时每个种类的金属总的价值也不同,分别为v1,v2,...,vs。阿里巴巴想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意:金属是可以被任意分割的,并且金属的价值和其重量成正比。   

【输入】 第1行是测试数据的组数k,后面跟着k组输入。 每组测试数据占3行,第1行是一个正整数w(1≤w≤10000),表示口袋承重上限。第2行是一个正整数s(1≤s≤100),表示金属种类。第3行有2s个正整数,分别为n1,v1,n2,v2,...,ns,vs分别为第一种,第二种,...,第s种金属的总重量和总价值(1≤ni≤10000,1≤vi≤10000)。

【输出】 k行,每行输出对应一个输入。输出应精确到小数点后2位。

【输入样例】

 2           

 50          

 4          

10 100 50 30 7 34 87 100  

10000  

5  

1 43 43 323 35 45 43 54 87 43

【输出样例】

 171.93                

 508.00    

2.题目分析:

2.1问题描述:

给定口袋的承重上限w和s种金属,每种金属的总重量和总价值已知,金属可以分割并且价值与重量成正比。目标是尽可能多地带走最大总价值的金属。

2.2确定问题的最优子结构:        

每个子结构都旨在实现,当前背包承重下可获得的最大价值的金属重量。

如何实现:

      存储:要考虑重量、价值以及单位价值三者,可以用结构体进行存储。

                 struct Metal{  // 定义结构体Metal    

                  int weight;  // 总重量    

                  int value;  // 总价值    

                  double unitValue;  // 单位价值

                  };

       排序:优先选择当前单位重量价值最高的金属,  需要单独编写排序规则,  对所有金属按单位重量的价值从大到小排序。

             bool cmp(Metal m1, Metal m2){//定义比较函数cmp    

                     return m1.unitValue > m2.unitValue;

             }

2.3制定贪心策略:

在口袋能够容纳金属的情况下,优先选择当前单位重量价值最高的金属装入口袋。如果当前金属无法完全装入口袋,按照所占比例装入口袋,并计算总价值。

   if(a[j].weight <= remain){  // 如果当前金属的重量小于等于剩余容量,则将该金属全部放入背包              maxValue += a[j].unitValue * a[j].weight;          

          remain -= a[j].weight;  

  } else {  // 如果当前金属的重量大于剩余容量,则将当前金属按比例放入背包        

          maxValue += remain * a[j].unitValue;          

          remain = 0;            

          break;

}

2.4完整代码实现:

#include <iostream>
#include <algorithm>
using namespace std;

struct Metal {
    int weight;  // 总重量 n_i
    int value;   // 总价值 v_i
    double unitValue; // 单位价值
};

bool cmp(Metal m1, Metal m2) {
    return m1.unitValue > m2.unitValue; // 按单位价值降序排序
}

int main() {
    int k;
    cin >> k; // 测试数据组数
    while (k--) {
        int W, S;
        cin >> W >> S; // 承重W, 金属种类S
        Metal a[105];
        for (int i = 0; i < S; i++) {
            cin >> a[i].weight >> a[i].value;
            a[i].unitValue = static_cast<double>(a[i].value) / a[i].weight;
        }
        sort(a, a + S, cmp); // 关键:按单位价值排序

        double maxValue = 0;
        int remain = W; // 剩余承重
        for (int i = 0; i < S; i++) {
            if (a[i].weight <= remain) { // 完整装载当前金属
                maxValue += a[i].value;
                remain -= a[i].weight;
            } else { // 部分装载
                maxValue += remain * a[i].unitValue;
                remain = 0;
                break;
            }
        }
        printf("%.2lf\n", maxValue); // 输出最大价值
    }
    return 0;
}

       

相关文章:

c++算法学习5——贪心算法

一、贪心算法的原理 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前最优决策的策略&#xff0c;通过局部最优解的累积逼近全局最优解。其核心思想是“着眼当前&#xff0c;忽略整体”&#xff0c;适用于满足​​最优子结构​​和​​贪心选…...

SpringCloud学习笔记-3

声明&#xff1a;笔记来源于网络&#xff0c;如有侵权联系删除 1 openfeign 1&#xff09;openfeign远程调用声明式实现 1.启动类中添加注解 EnableFeignClients EnableFeignClients SpringBootApplication public class OrderMainApplication {public static void main(St…...

【时时三省】(C语言基础)局部变量和全局变量

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 以前所见到的程序大多数是一个程序只包含一个main函数&#xff0c;变量是在函数的开头处定义的。这些变量在本函数范围内有效&#xff0c;即在本函数开头定义的变量&#xff0c;在本函数中可…...

An improved YOLACT algorithm for instance segmentation of stacking parts

【一种用于堆叠零件实例分割的改进 YOLACT 算法】 摘要 实例分割在众多应用场景中均是一项至关重要的任务。对于计算机视觉而言,堆叠物体的实例分割是一项挑战。为应对这一挑战,我们提出了一种改进的 YOLACT(You Only Look At CoefficienTs)算法。为提高密集堆叠场景下特…...

使用API网关Kong配置反向代理和负载均衡

简介 Kong 是一个微服务API网关。 Kong是一个云原生&#xff0c;快速&#xff0c;可扩展和分布式微服务抽象层&#xff08;也称为API网关&#xff0c;API中间件或在某些情况下为Service Mesh&#xff09;。 作为2015年的开源项目&#xff0c;其核心价值在于高性能和可扩展性。…...

BugKu Web渗透之eval

启动场景&#xff0c;打开网页&#xff0c;显示的是一段代码。 步骤一&#xff1a; 分析代码。 代码大概意思是&#xff1a; <?php//包含"flag.php"的文件include "flag.php"; //获取网页请求的hello数据$a $_REQUEST[hello]; //显示变量a的详…...

DAY45 可视化

DAY 45 Tensorborad 之前的内容中&#xff0c;我们在神经网络训练中&#xff0c;为了帮助自己理解&#xff0c;借用了很多的组件&#xff0c;比如训练进度条、可视化的loss下降曲线、权重分布图&#xff0c;运行结束后还可以查看单张图的推理效果。 如果现在有一个交互工具可…...

11.RV1126-ROCKX项目 API和人脸检测画框

一.ROCKX的API 1.ROCKX的作用 ROCKX的AI组件可以快速搭建 AI的应用&#xff0c;这些应用可以是车牌识别、人脸识别、目标识别&#xff0c;人体骨骼识别等等。主要用于各种检测识别。例如下图&#xff1a; 2.ROCKX人脸识别的API rockx_ret_t rockx_create(rockx_handle_t *han…...

超构光学与 AR 的深度融合 | 攻克 VAC 与眼动范围难题

原文信息 原文标题&#xff1a;“Three-dimensional varifocal meta-device for augmented reality display” 第一作者&#xff1a;宋昱舟&#xff0c;袁家琪&#xff0c;陳欽杪&#xff0c;刘小源 &#xff0c;周寅&#xff0c;程家洛&#xff0c;肖淑敏*&#xff0c;陈沐…...

[ Qt ] | 与系统相关的操作(三):QFile介绍和使用

目录 之前的操作文件的方式 Qt中的文件操作简介 QFile 打开 读 写 关闭 一个例子来说明 QFileInfo 之前的操作文件的方式 C语言中&#xff0c;fopen 打开文件&#xff0c;fread fwrite 读写文件&#xff0c;fclose 关闭文件。 C中&#xff0c;fstream 打开文件&…...

RetroMAE 预训练任务

RetroMAE 预训练任务的具体步骤&#xff0c;围绕 编码&#xff08;Encoding&#xff09;、解码&#xff08;Decoding&#xff09;、增强解码&#xff08;Enhanced decoding&#xff09; 三个核心阶段展开&#xff0c;以下结合图中流程拆解&#xff1a; 一、阶段 A&#xff1a;…...

软件工程:如何做好软件产品

1、什么是产品 从项目到产品 产品&#xff1a;满足行业共性需求的标准产品。即要能够做到配置化的开发&#xff0c;用同一款产品最大限度地满足不同客户的需求&#xff0c;同时让产品具有可以快速响应客户需求变化的能力。 好的产品一定吸收了多个项目的共性&#xff0c;一定是…...

蓝桥杯 省赛 2025python(B组)题目(分析)

目录 第一题 为什么答案是103而不是104&#xff1f; 第二题 为什么必须按长度排序&#xff1f; 第三题 易错点总结 第四题 逻辑问题&#xff1a; 可能超过时间复杂度的代码示例 1. 暴力枚举所有可能的子串 2. 递归回溯 第五题 1. 暴力枚举法 2. 优化枚举 3.数…...

React - 组件通信

组件通信 概念&#xff1a;组件通信就是组件之间数据传递&#xff0c;根据组件嵌套关系不同&#xff0c;有不同的通信方法 父传子 —— 基础实现 实现步骤 父组件传递数据 - 在子组件标签上绑定属性子组件接收数据 - 子组件通过props参数接收数据 声明子组件并使用 //声明子…...

《前端面试题:CSS的display属性》

CSS display属性完全指南&#xff1a;深入理解布局核心属性 掌握display属性是CSS布局的基石&#xff0c;也是前端面试必考知识点 一、display属性概述&#xff1a;布局的核心控制 display属性是CSS中最重要、最基础的属性之一&#xff0c;它决定了元素在页面上的渲染方式和布…...

飞牛使用Docker部署Tailscale 内网穿透教程

之前发过使用docker部署Tailscale的教程&#xff0c;不过是一年前的事情了&#xff0c;今天再重新发表一遍&#xff0c;这次使用compose部署更加方便&#xff0c;教程也会更加详细一点&#xff0c;希望对有需要的朋友有所帮助&#xff01; 对于大部分用户来说&#xff0c;白嫖 …...

《数据挖掘》- 房价数据分析

这里写目录标题 采用的技术1. Python编程语言2. 网络爬虫库技术点对比与区别项目技术栈的协同工作流程 代码解析1. 导入头文件2. 读取原始数据3. 清洗数据4. 数据分割4.1 统计房屋信息的分段数量4.2 将房屋信息拆分为独立列4.3 处理面积字段4.4 删除原始房屋信息列 5. 可视化分…...

centos中的ulimit命令

centos中的ulimit命令 ulimit的作用CENTOS系统文件配置配置文件地址配置格式 配置方法 ulimit的作用 ulimit用于限制shell启动进程所占用的资源&#xff0c;支持以下各种类型的限制&#xff1a;所创建的内核文件的大小、进程数据块的大小、Shell进程创建文件的大小、内存锁住的…...

git提交代码和解决冲突修复bug

提交到分支的步骤如下&#xff1a; 确保你当前在开发分支上&#xff0c;可以使用命令 git branch 来查看当前所在分支&#xff0c;并使用 git checkout 命令切换到开发分支。使用 git add 命令将修改的文件添加到暂存区。使用 git commit 命令提交代码到本地仓库。 解决合并冲…...

华为仓颉语言初识:并发编程之同步机制(上)

前言 线程同步机制是多线程下解决线程对共享资源竞争的主要方式&#xff0c;华为仓颉语言提供了三种常见的同步机制用来保证线程同步安全&#xff0c;分别是原子操作&#xff0c;互斥锁和条件变量。本篇文章详细介绍主要仓颉语言解决同步机制的方法&#xff0c;建议点赞收藏&a…...

php中实现邮件发送功能

要在php项目中实现邮件发送功能&#xff0c;推荐使用phpmailer库通过smtp协议配置。首先安装phpmailer扩展&#xff0c;可通过composer命令composer require phpmailer/phpmailer安装&#xff1b;若未使用composer则手动引入源码。接着配置smtp信息&#xff0c;包括服务器地址&…...

C++之动态数组vector

Vector 一、什么是 std::vector&#xff1f;二、std::vector 的基本特性&#xff08;一&#xff09;动态扩展&#xff08;二&#xff09;随机访问&#xff08;三&#xff09;内存管理 三、std::vector 的基本操作&#xff08;一&#xff09;定义和初始化&#xff08;二&#xf…...

arc3.2语言sort的时候报错:(sort < `(2 9 3 7 5 1)) 需要写成这种:(sort > (pair (list 3 2)))

arc语言sort的时候报错&#xff1a;(sort < (2 9 3 7 5 1)) arc> (sort < (2 9 3 7 5 1)) Error: "set-car!: expected argument of type <pair>; given: 9609216" arc> (sort < (2 9 3 )) Error: "Function call on inappropriate object…...

Android动态广播注册收发原理

一、动态广播的注册流程 1. ​​注册方式​​ 动态广播通过代码调用 Context.registerReceiver() 方法实现&#xff0c;需显式指定 IntentFilter 和接收器实例&#xff1a; // 示例&#xff1a;在 Activity 中注册监听网络变化的广播 IntentFilter filter new IntentFilter…...

Ubuntu 系统通过防火墙管控 Docker 容器

Ubuntu 系统通过防火墙管控 Docker 容器指南 一、基础防火墙配置 # 启用防火墙 sudo ufw enable# 允许 SSH 连接&#xff08;防止配置过程中断联&#xff09; sudo ufw allow 22/tcp二、Docker 配置调整 # 编辑 Docker 配置文件 sudo vim /etc/docker/daemon.json配置文件内…...

AI 模型分类全解:特性与选择指南

人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活和工作方式。AI 模型作为实现人工智能的核心组件&#xff0c;种类繁多&#xff0c;功能各异。从简单的线性回归模型到复杂的深度学习网络&#xff0c;从文本生成到图像识别&#xff0c;AI 模型的应用…...

【Zephyr 系列 11】使用 NVS 实现 BLE 参数持久化:掉电不丢配置,开机自动加载

🧠关键词:Zephyr、NVS、非易失存储、掉电保持、Flash、AT命令保存、配置管理 📌目标读者:希望在 BLE 模块中实现掉电不丢配置、支持产测参数注入与自动加载功能的开发者 📊文章长度:约 5200 字 🔍 为什么要使用 NVS? 在实际产品中,我们经常面临以下场景: 用户或…...

【Android】Android Studio项目代码异常错乱问题处理(2020.3版本)

问题 项目打开之后&#xff0c;发现项目文件直接乱码&#xff0c; 这样子的 这本来是个Java文件&#xff0c;结果一打开变成了这种情况&#xff0c;跟见鬼一样&#xff0c;而且还不是这一个文件这样&#xff0c;基本上一个项目里面一大半都是这样的问题。 处理方法 此时遇到…...

n皇后问题的 C++ 回溯算法教学攻略

一、问题描述 n皇后问题是经典的回溯算法问题。给定一个 nn 的棋盘&#xff0c;要求在棋盘上放置 n 个皇后&#xff0c;使得任何两个皇后之间不能互相攻击。皇后可以攻击同一行、同一列以及同一对角线上的棋子。我们需要找出所有的合法放置方案并输出方案数。 二、输入输出形…...

一些免费的大A数据接口库

文章目录 一、Python开源库&#xff08;适合开发者&#xff09;1. AkShare2. Tushare3. Baostock 二、公开API接口&#xff08;适合快速调用&#xff09;1. 新浪财经API2. 腾讯证券接口3. 雅虎财经API 三、第三方数据平台&#xff08;含免费额度&#xff09;1. 必盈数据2. 聚合…...