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

算法设计与分析复习--贪心(一)

文章目录

  • 上一篇
  • 贪心的性质
  • 活动安排问题
  • 贪心背包问题
  • 最优装载
  • 下一篇

上一篇

算法设计与分析复习–动态规划

贪心的性质

在这里插入图片描述
贪心和动态规划都要求问题具有最优子结构;
可用贪心方法时,动态规划可能不适用
可用动态规划方法时,贪心方法可能不适用

活动安排问题

AcWing 908. 最大不相交区间数量

产生最优解的排序是按照结束时间从小到大排序,看不重合区间的数量

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

typedef pair<int, int> PII;//使用pair存储一个时间段
const int N = 100010;

int n;
vector<PII> a;

bool cmp(PII x, PII y)
{
    return x.second < y.second;//结束时间小的排前面
}

int main()
{
    scanf("%d", &n);
    
    for (int i = 0; i < n; i ++)
    {
        int l, r;
        scanf("%d%d", &l, &r);
        a.push_back({l, r});
    }
    
    sort(a.begin(), a.end(), cmp);// 按结束时间进行先后排序
    
    int res = 1, ed = a[0].second;
    for (auto i : a)
    {
        if (i.first > ed){//不重合就加上,更新ed
            res ++;
            ed = i.second;
        }
    }
    printf("%d", res);
    return 0;
}

贪心背包问题

与一般的背包问题不一样,开始给出的是整个物品的重量和价值,但是可以只放这个物品的一部分=>贪心背包
在这里插入图片描述
按单价排序是贪心背包的解决方法

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

typedef pair<double, double> PII;//存在小数情况都要改成double类型
const int N = 1010;

int n, c;
double w[N], v[N];
vector<PII> ob;

bool cmp(PII x, PII y)
{
    return (x.second / x.first) > (y.second / y.first); 
}

int main()
{
    scanf("%d%d", &n, &c);
    
    for (int i = 0; i < n; i ++) scanf("%lf", &w[i]); // 读取为double类型
    for (int i = 0; i < n; i ++) scanf("%lf", &v[i]); // 读取为double类型
    for (int i = 0; i < n; i ++) ob.push_back({w[i], v[i]});
    
    sort(ob.begin(), ob.end(), cmp);
    
    double bv = 0, cw = 0;
    for (auto i : ob)
    {
        cw += i.first;
        if (cw > c){
            bv += (c - (cw - i.first)) * (i.second / i.first); // 把之前加上的i.first要先减掉
            break;
        }
        bv += i.second;
    }
    
    printf("%.2lf", bv); // 输出精度为两位小数
    return 0;
}

在这里插入图片描述

最优装载

在这里插入图片描述
贪心选择策略:重量最轻者优先装载

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;
typedef pair<int, int> PII;

const int N = 100010;

int n, c, x[N], cc;
vector<PII> ob;

int main()
{
    scanf("%d%d", &n, &c);
    for (int i = 0; i < n; i ++)
    {
        int w;
        scanf("%d", &w);
        ob.push_back({w, i});
    }
    
    sort(ob.begin(), ob.end());
    
    int res = 0;
    for (auto i : ob)
    {
        cc += i.first;
        if (cc <= c){
            res ++;
            x[i.second] = 1;
        }
        else{
            x[i.second] = 0;   
        }
    }
    
    printf("%d\n", res);
    for(int i = 0; i < n; i ++) printf("%d ", x[i]);
    return 0;
}

在这里插入图片描述
在这里插入图片描述

下一篇

算法设计与分析复习–贪心(二)


http://www.kler.cn/a/134408.html

相关文章:

  • 灰狼优化算法
  • Spring Cloud Contract快速入门Demo
  • 《DiffusionDet: Diffusion Model for Object Detection》ICCV2023
  • ISAAC SIM踩坑记录--ubuntu 22.04操作系统安装
  • 软件测试项目实战
  • 基于promtail+loki+grafana搭建日志系统
  • 特效!视频里的特效在哪制作——Adobe After Effects
  • java智慧校园信息管理系统源码带微信小程序
  • 【wp】2023第七届HECTF信息安全挑战赛 Web
  • 什么是Selenium?如何使用Selenium进行自动化测试?
  • 初刷leetcode题目(4)——数据结构与算法
  • C# Array和ArrayList有什么区别
  • WPF拖拽相关的类
  • 详解Java设计模式之职责链模式
  • S7-1200PLC 作为MODBUSTCP服务器通信(多客户端访问)
  • Web安全研究(五)
  • python中Thread实现多线程任务
  • iTerm2+oh-my-zsh搭个Mac电脑上好用好看终端
  • Zotero在word中插入参考文献
  • 队列和微服务的异步通信
  • Python选择排序和冒泡排序算法
  • linux基础:4:gdb的使用
  • 保姆级 | Nginx编译安装
  • golang学习笔记——条件表达式
  • 【Dubbo】Dubbo负载均衡实现解析
  • nodejs微信小程序-实验室上机管理系统的设计与实现-安卓-python-PHP-计算机毕业设计