【算法篇】贪心算法

目录

贪心算法

贪心算法实际应用 

一,零钱找回问题

二,活动选择问题

三,分数背包问题

将数组和减半的最小操作次数

最大数


贪心算法

贪心算法,是一种在每一步选择中都采取当前状态下的最优策略,期望得到全局最优解的算法策略。也就是说,通过局部最优解,期望得到全局最优解。

贪心算法一般按如下步骤执行:

1,问题分解: 将原问题转化为一系列子问题。

2,贪心选择:对每个子问题求解的时候,都选择当前看起来“最优的”解法。

3,合并解:累计局部最优解形成全局解。

4,正确性证明:通过数学归纳或者替换论证验证。(因为贪心策略可能是错误的)

先简单理解一下贪心算法:

例一:找零问题

这个问题在我们日常生活中很普遍。

假设我们现在可以找的零钱面额为【20,10,5,1】,并且每个有无限张。当我们想找k的零钱时,怎样可以让钱的张数最少?

这里假设k=46,用 贪心算法的思想,每一步尽可能使用面值最大的纸币即可。

46->  选一张20  -> 26  -> 选一张20 -> 6-> 选一张5->1->选一张1

例二:最小路径和

给你一个矩阵,求解:从矩阵的左上角出发,只能向下和向右两个方向走,求到达矩阵的右下角过程中,路径上所有元素和的最小值。

贪心算法实际应用 

一,零钱找回问题

假设1元,5元,10元,20元,50元,100元的纸币分别有

c0,c1,c2,c3,c4,c5张 。现在用这些钱来找回k元,求最少使用的张数。

用贪心算法的思想,每一步找钱尽可能使用面值大的。

//单张钱的面额
int signle_money[7] = { 1,2,5,10,20,50,100 };
//对应前的个数
int number_money[7] = {2,5,1,3,4,0,4};

//存放结果
int total[7] = { 0 };

int tanxin(int money)
{
    if (money >= 0)
    {
        //每一步尽量选最大的面额
        for (int i = 6; i >=0; i--)
        {
            total[i] = min(number_money[i], money / signle_money[i]);
            money = money - total[i] * signle_money[i];
        }
        return 0;
    }
    else
    {
        return money;
    }
}
int main()
{
    int k = 0;
    cout << "输入 要找回的零钱" << endl;
    cin >> k;

    if (!tanxin(k))
    {
        cout << "贪心结果为:" << endl;
        for (int i = 0; i < 7; i++)
            cout << signle_money[i] << "元:" << total[i] << "张" << endl;
    }
    else
    {
        cout << "ops wrong number" << endl;
    }
    return 0;
}
 

  

二,活动选择问题

有n个活动,a1,a2,a3...an,这些活动需要在同一天使用同一个教室。每个活动都有一个开始时间si和结束时间fi,一旦被选择后,活动ai就占据半开时间[si,fi)。如果[si,fi)和[sj,fj)互不重叠,那么ai和aj两个活动可以被安排在同一天。该问题是安排这些活动,使尽量多的活动不冲突的举行。

贪心策略:想要使尽量多的活动不冲突,那我们在选择活动时,就尽量选择结束早的活动,为后续留出更多的时间。

//活动安排问题
#include <algorithm>
struct ACT
{
    int start;
    int end;
}activity[100];

//活动的个数
int N;

bool cmp(ACT a, ACT b)
{
    return a.end < b.end;
}

int greedy()
{
    int num = 0;

    for (int i = 0, j = i + 1; i < N; j++)
    {
        if (activity[j].start > activity[i].end)
        {
            i = j;
            num++;
        }
    }

    return num;
}

int main()
{
    cout << "活动的总数:";
    cin >> N;
    cout << "输入每个活动的开始和结束:" << endl;

    for (int i = 0; i < N; i++)
    {
        cin >> activity[i].start;
        cin >> activity[i].end;
    }
    
    //将活动按结束时间排序,升序
    sort(activity, activity + N, cmp);

    //统计结果
    int res = greedy();
    cout << "安排的活动个数:" << res << endl;
    return 0;
}
 

三,分数背包问题

情景描述:给定背包容量和一些物品,每个物品有重量和价值两个属性。允许只取一个物品的一部分加入背包,求问如何才能使背包装的物品价值最大。

与01背包不同,分数背包问题允许将物品的部分装入背包。这意味着我们可以将一个物品分割成任意大小,并根据其重量比例来计算其价值。

贪心策略:

核心思想:按性价比来排序。即每个物品的单位价值:价值/重量。

按照单位价值从高到低对物品进行排序,然后依次考虑每个物品 。

算法步骤:

   1,将所有物品按照单位价值从高到低排序。

    2,遍历排序后的物品。对于每个物品:

  • 如果物品重量小于等于背包剩余容量 ,就将物品装入背包。
  • 如果物品重量大于背包剩余容量,只装入能狗适应当前容量的部分。

//分数背包问题
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Item
{
public:
    int _w;
    int _v;
    Item() = default;
    Item(int w,int v)
        :_w(w)
        ,_v(v)
    {}
};

bool cmp(Item a, Item b)
{
    return a._v / a._w > b._v /a._w;
}

double greed(vector<int>& w, vector<int>& v, int cap)
{
    vector<Item> items(w.size());
    double res = 0;

    for (int i = 0; i < w.size(); i++)
    {
        items[i] = { w[i], v[i] };
    }

    sort(items.begin(), items.end(), cmp);

    for (auto& item : items)
    {
        if (item._w <= cap)
        {
            res += item._v;
            cap -= item._w;
        }
        else
        {
            res += (double)item._v / item._w * cap;
            break;
        }
    }

    return res;
}
int main()
{
    vector<int> w = { 10,20,30,40,50 };
    vector<int> v = { 50,120,150,210,240 };
    //背包容量
    int cap = 50;
    cout << "MAX_value:" << greed(w, v, cap) << endl;

    return 0;
}

                   

将数组和减半的最小操作次数

本题链接:2208. 将数组和减半的最少操作次数 - 力扣(LeetCode)

 贪心策略:每次选出数组中的最大值,对该数减半,直到使数组和减小到一半。

算法步骤:

  • 计算出数组和的一半sum
  • 每次选数组 中最大的数a进行减半,sum-=a/2,找到sum为0结束。

在每次选最大数的时候,我们可以借助优先级队列,快速找的最大值。

class Solution {
public:int halveArray(vector<int>& nums) {priority_queue<double> heap;double sum=0.0;for(int x:nums){sum+=x;heap.push(x);}sum/=2.0;int count=0;while(sum>0){double t=heap.top()/2.0;sum-=t;heap.pop();heap.push(t);count++;}return count;}
};

最大数

本题链接:179. 最大数 - 力扣(LeetCode)

贪心策略:本题可以理解为是对数组nums进行重新“排序”,而传统的排序是根据大小排的,对于本题,则是按照题目要求。

对于nums数组中的两个元素a和b, 我们无法直接确定他们的先后关系,但我们可以从结果角度来看,如果拼接结果ab要比ba好,那么a就应该放在b的前面。

class Solution {
public:string largestNumber(vector<int>& nums) {vector<string> strs;for(auto x:nums)strs.push_back(to_string(x));sort(strs.begin(),strs.end(),[](string s1,string s2){return s1+s2>s2+s1;});string ret;for(auto& s:strs)ret+=s;//处理前导0if(ret[0]=='0') return "0";return ret;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法学习笔记----博弈论

# 数据结构与算法学习笔记----博弈论 author: 明月清了个风 first publish time: 2025.2.6 ps⭐️包含了博弈论中的两种问题Nim游戏和SG函数&#xff0c;一共四道例题&#xff0c;给出了具体公式的证明过程。 Acwing 891. Nim游戏 [原题链接](891. Nim游戏 - AcWing题库) 给…

Yageo国巨的RC系列0402封装1%电阻库来了

工作使用Cadence多年&#xff0c;很多时候麻烦的就是整理BOM&#xff0c;因为设计原理图的时候图省事&#xff0c;可能只修改value值和封装。 但是厂家&#xff0c;规格型号&#xff0c;物料描述等属性需要在最后的时候一行一行的修改&#xff0c;繁琐又容易出错&#xff0c;过…

app专项测试(网络测试流程)

一、网络测试的一般流程 step1&#xff1a;首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2&#xff1a;其次要考虑无网络的情况 ① APP各个功能在无网络情况下是否可用 ② APP各个页面之间切换是否正常 ③ 发送网络请求时是…

RFID隧道机:提升生产流水线效率与精准度

在当今制造业飞速发展的时代&#xff0c;生产流水线的效率与精准度成为企业竞争力的关键。传统的货物管理往往依赖于人工扫描和记录&#xff0c;效率低下且易出错&#xff0c;而RFID 隧道机的出现&#xff0c;为企业带来了智能化的管理体验&#xff0c;为生产流水线带来了从人工…

NSS-DAY2

Crypto [HNCTF 2022 Week1]A dictator 题目&#xff1a; from random import randint from secret import flagoffset randint(1,100) % 26 # print(offset)assert flag.startswith(NSSCTF{) assert all([ord(c) not in range(ord(A),ord(Z)) for c in flag[7:-1]])for cha…

systemctl配置httpd服务

一、环境介绍&#xff1a; Operating SystemopenEuler 22.03 (LTS-SP2)Kernel Linux 5.10.0-153.56.0.134.oe2203sp2.x86_64httpd versionhttpd-2.4.59ip address192.168.240.12/24 二、下载需要的软件包 yum install -y gcc gcc-c make apr apr-devel apr-util-devel pcre …

Redis bitmap应用

Redis bitmap应用 需求&#xff1a;存储用户今年已签到的天数&#xff0c;如在1月3日签到&#xff0c;则存 3 。。。以此类推 每秒300次请求压力测试 1、使用数据库存储 查询代码与时间 public List<Integer> selectSignRecord(long userId, Integer year) {if (year nu…

蓝桥杯之c++入门(六)【string(practice)】

目录 练习1&#xff1a;标题统计方法1&#xff1a;一次性读取整行字符&#xff0c;然后统计方法2&#xff1a;按照单词读取小提示&#xff1a; 练习2&#xff1a;石头剪子布练习3&#xff1a;密码翻译练习4&#xff1a;文字处理软件练习5&#xff1a;单词的长度练习6&#xff1…

uniapp访问django目录中的图片和视频,2025[最新]中间件访问方式

新建中间件, middleware.py 匹配,以/cover_image/ 开头的图片 匹配以/episode_video/ 开头的视频 imageSrc: http://192.168.110.148:8000/cover_image/12345/1738760890657_mmexport1738154397386.jpg, videoSrc: http://192.168.110.148:8000/episode_video/12345/compres…

gc buffer busy acquire导致的重大数据库性能故障

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…

[NKU]C++安装环境 VScode

bilibili安装教程 vscode 关于C/C的环境配置全站最简单易懂&#xff01;&#xff01;大学生及初学初学C/C进&#xff01;&#xff01;&#xff01;_哔哩哔哩_bilibili 1安装vscode和插件 汉化插件 ​ 2安装插件 2.1 C/C 2.2 C/C Compile run ​ 2.3 better C Syntax ​ 查看已…

DeepSeek-r1模型本地化部署最新教程

新的改变 DeepSeek 的搜索引擎基于深度学习算法&#xff0c;能够理解和分析大量的数据源&#xff08;如文本、图像、视频等&#xff09;&#xff0c;并结合用户的行为数据和偏好&#xff0c;提供个性化的搜索结果。 最近爆火的DeepSeek不用多说了&#xff0c;快来本地部署感受…

网络工程师 (20)计算机网络的概念

一、定义 计算机网络是指将地理位置不同、具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路及通信设备连接起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现信息传递和资源共享的计算机通信系统。 二、组成 资源子网&…

支持向量机(一)

支持向量机是典型的二分类模型&#xff0c;以其模型简单、实现简单、效果卓越而著称。 一元支持向量机 我们通过一条中间线根据特征对样本实现分类&#xff0c;很明显&#xff1a;两个支持样本的差别越大&#xff0c;两个支持样本的分类效果就越好。 二元支持向量机 在实际生…

React 设计模式:实用指南

React 提供了众多出色的特性以及丰富的设计模式&#xff0c;用于简化开发流程。开发者能够借助 React 组件设计模式&#xff0c;降低开发时间以及编码的工作量。此外&#xff0c;这些模式让 React 开发者能够构建出成果更显著、性能更优越的各类应用程序。 本文将会为您介绍五…

vscode 如何通过Continue引入AI 助手deepseek

第一步&#xff1a; 在deepseek 官网上注册账号&#xff0c;得到APIKeys(deepseek官网地址) 创建属于自己的APIKey,然后复制这个key,(注意保存自己的key)! 第二步&#xff1a; 打开vscode,在插件市场安装Continue插件, 点击设置&#xff0c;添加deepseek模型&#xff0c;默认…

LPJ-GUESS模型入门(一)

一、模型简介 LPJ-GUESS是一个基于过程的动态植被陆地生态系统模型&#xff0c;专为区域或全球研究而设计。这种模型通常被称为动态全球植被模型&#xff08;DGVM&#xff09;。根据区域气候条件和大气二氧化碳浓度的数据&#xff0c;它可以预测地球主要气候带本土生态系统的结…

Windows本地部署DeepSeek-R1大模型并使用web界面远程交互

文章目录 前言1. 安装Ollama2. 安装DeepSeek-r1模型3. 安装图形化界面3.1 Windows系统安装Docker3.2 Docker部署Open WebUI3.3 添加Deepseek模型 4. 安装内网穿透工具5. 配置固定公网地址 前言 最近爆火的国产AI大模型Deepseek详细大家都不陌生&#xff0c;不过除了在手机上安…

MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR)

MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR) MySQL官方文档&#xff1a; https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html 一. 对比&#xff1a; 在 MySQL 中&#xff0c;处理时间相关的数据类型主要有以下几种&#xff1a;DATE、TIME、…

Ubuntu部署Deepseek-R1模型(8b)

安装ubuntu系统 本机电脑系统ubuntu-20.04 #升级软件 sudo apt-get update#安装curl sudo apt-get install curl通过以上两条指令&#xff0c;完成了curl命令的安装。 安装ollama 打开Ollama官网 选择Linux&#xff0c; 给出如上图方框所示的一条指令 curl -fsSL https:…