贪心算法(1)--经典贪心算法

news2024/10/6 3:20:41

目录

一、活动安排问题

二、最优装载问题

三、分数背包问题

四、多机调度问题


一、活动安排问题

1、策略

        活动安排问题:设有n个活动的集合E={1,2,...,n},每个活动i都有一个使用该资源的起始时间s_i和一个结束时间f_i,且s_i<f_i。如果选择了活动i则它在时间区间[s_i,f_i)内占用资源,如何在有限的时间内选择最多的活动方案安排。

        解法按结束时间优先的贪心算法。

(1) 如果活动i和活动j能够相容,假设活动i在活动j之前,那么一定有f_i\leqslant s_j

(2)按照f_i序列对f_is_i同时进行排序,保证两者对应。排序可以使用快速排序、归并排序和堆排复杂度为O(nlogn)。

(3)第1个活动f_i最小,所以进入活动安排,其他如果存在s_j\geqslant f_i,则i=j,移动活动安排。

       给定一个活动序列 i,s_i,f_i的关系:

2、代码 

//活动安排
import java.util.Scanner;
public class activityarrangement {
   public static void main(String[] args)
   {
        int n=new Scanner(System.in).nextInt();
        int s[]=new int[n];
        int f[]=new int[n];
        for(int i=0;i<n;i++)
            s[i]=new Scanner(System.in).nextInt();
        for(int i=0;i<n;i++)
            f[i]=new Scanner(System.in).nextInt();
        quickSort(f,s, 0, n-1);
        GreedySelector(s,f);
   }
   public static void GreedySelector(int s[],int f[]) 
   {
        System.out.println(s[0]+" "+f[0]);
        int j=0;
        for(int i=1;i<s.length;i++)
        {
            if(s[i]>=f[j])
            {
                System.out.println(s[i]+" "+f[i]);
                j=i;
            }
        }
   }

二、最优装载问题

1、策略

        有一批集装箱要装上一艘载重为c的轮船,集装箱i的重量为w_i,要求装载体积不受限制情况下,将尽可能多的集装箱装上轮船。

        利用贪心算法重量最轻的集装箱优先装载,直到轮船载重无法继续装入集装箱。

        排序方法可以使用快排、归排和堆排来降低时间复杂度。

        约束条件和目标函数如下:

        例题如下: 

2、代码 

//最优装载问题
public static void main(String []args) 
   {
        int c=400;
        int weights[]={100,200,50,90,150,50,20,80};
        quickSort(weights,0,weights.length-1);
        System.out.println(load(weights,c));
   }
public static int load(int weights[],int c)
   {
        int tmp=c;
        for(int i=0;i<weights.length;i++)
        {
            if(c>weights[i])
            {
                c-=weights[i];
            }
        }
        return tmp-c;
   } 

三、分数背包问题

1、策略

        分数背包问题:在0-1背包的问题基础上,可以每个物品装一部分,即0~1背包问题,要求在有限的容量基础上,求解装有物品的最高总价值。

        策略:以单位重量价值最高的优先的贪心算法。

        建立a数组(单位重量下价值),以a数组为排序依据,同时排序a,w,v数组,计算a数组较大值优先的情况下能产生的最大总价值。

        例题如下:

2、代码

(省略排序过程)

//分数背包问题
public class dividebackage {
public static void main(String[] args)
   {
        int n=3;
        int c=20;
        double w[]={18,15,10};
        double v[]={25,24,15};
        double a[]=new double[n];
        for(int i=0;i<n;i++)
            a[i]=v[i]/w[i];

        quickSort(a,w,v,0,w.length-1);
        System.out.println(maximum(a,w,v,c));
        
            
   } 
public static double maximum(double a[],double w[],double v[],int c)
   {
        double value=0;
        int weight=0;
        for(int i=a.length-1;i>=0;i--)
        {
            if((c-weight)>=w[i])
            {
                value+=v[i];
                weight+=w[i];
            }
            else
            {
                value+=v[i]*(c-weight)/w[i];
                break;
            }
        }
        return value;
   }
}

四、多机调度问题

1、概述

        多机调度问题:设有n个独立作业,由m台相同机器进行加工处理,作业i所需的处理时间为t_i,每个作业均可以在任何一台机器上加工处理,但不可间断、拆分。设计一种算法,使得n个作业在尽可能短的时间内由m台机器加工处理完成。

        策略:按任务时间较长的进行贪心算法,设定time,p,d,m,s五个数组(定义看下面代码注释),首先对time数组和p数组按任务时间降序排序(快排),调度问题为添加任务和时间推移两个阶段循环进行,直到任务不再添加,所有机器还需占用时间数为0,则退出调度问题。

        添加任务:遍历每一个机器,若当前机器m还需占用时间为0,且仍有任务i需要添加,则将任务i添加到机器m,机器m的所做任务数加一,机器m执行任务添加任务i编号。

        时间推移:时间后移一,每个任务的还需所占用时间减一,若每个机器的所占用时间都为0且没有新任务添加,则退出调度问题,返回当前时间。若存在机器i所占用时间为0,但仍有其他机器任务未结束,则机器i占用时间不再减少,避免出现负数。

        下面例题解决效果:

2、代码 

//多机调度问题
public class multimachine {
   public static void main(String[] args)
   {
        int time[]={2,14,4,16,6,5,3};               //每个任务所占时间
        int p[]={1,2,3,4,5,6,7};                    //任务编号
        int d[]={0,0,0};                            //当前机器还需占用时间数
        int m[]={0,0,0};                            //每个机器执行了几个任务
        int s[][]=new int[d.length][time.length];   //每个机器执行了哪些任务
        //对时间列和任务编号进行重新排序
        quickSort(time,p,0,time.length-1);
        //输出多机调度总时间
        deploy(time,p,d,s,m);
        //输出每个机器执行了哪些任务
        for(int i=0;i<d.length;i++)
        {
            for(int j=0;j<time.length;j++)
            {
                if(s[i][j]==0)
                    break;
                System.out.print(s[i][j]+" ");
            }
            System.out.println("");
        }
   } 
   public static void deploy(int time[],int p[],int d[],int s[][],int m[])
   {
        int tot=0;
        int c=0;    //总作业序列顺序执行到几个
        while(true)
        {
            //进入任务,增加每个机器的所占用时间
            for(int i=0;i<d.length;i++)
            {
                if(d[i]==0&&c<time.length)
                {
                    d[i]+=time[c];
                    s[i][m[i]++]=p[c++];
                }
            }
            tot+=1;
            int zero=0;
            //时间推移加一,减少每个机器的所占用时间
            for(int i=0;i<d.length;i++)
            {
                if(d[i]==0)
                    break;
                d[i]--;
                zero+=d[i];
            }
            //若每个机器都为0,且没有任务继续添加,则终止调度
            if(zero==0)
                break;
        }
        System.out.println(tot);
   }

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

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

相关文章

新年学新语言Go之五

一、前言 Go虽然不算是面向对象语言&#xff0c;但它支持面向对象一些特性&#xff0c;面向接口编程是Go一个很重要的特性&#xff0c;而Go的接口与Java的接口区别很大&#xff0c;Go的接口比较复杂&#xff0c;这里仅用一个最简单例子做介绍&#xff0c;复杂的我也还没学。 …

VMware中安装centos无网络,配置教程

VMware虚拟机中装了centos7,装完之后一直无法联网&#xff0c;网上的教程都试了也没用&#xff0c;这里记录一下最后的解决方案。 VMware配置 1. 点击 虚拟机-》设置 windows配置 打开电脑网络连接 共享选项选中我们虚拟机网络中包含的VMnet8的 VMnet8网络就自动变成这样了&a…

软件研发流程、架构规范、技术标准、需求过程等全文档

前言&#xff1a; 软件项目管理全文档包括以下几个方面&#xff1a;需求分析、项目规划、过程管理、测试和部署。 全文档获取&#xff1a;Q:262086839 例图在文末。 正文&#xff1a; 一、需求分析是软件项目管理的第一步&#xff0c;也是非常关键的一步。在需求分析阶段&…

SpringCloud 微服务全栈体系(二)

第三章 Eureka 注册中心 假如我们的服务提供者 user-service 部署了多个实例&#xff0c;如图&#xff1a; 思考几个问题&#xff1a; order-service 在发起远程调用的时候&#xff0c;该如何得知 user-service 实例的 ip 地址和端口&#xff1f;有多个 user-service 实例地址…

Xline 源码解读(四)—— CURP 状态机引擎

在上一篇源码解读的文章&#xff08;Xline 源码解读&#xff08;三&#xff09; —— CURP Server 的实现&#xff09;中&#xff0c;我们简单阐述了Xline 的 Curp Server 是如何实现的。接下来&#xff0c;就让我们话接上回&#xff0c;继续深入地来了解 Curp Server 中的一些…

网络安全中的人工智能:优点、缺点、机遇和危险

2022 年秋天&#xff0c;人工智能在商业领域爆发&#xff0c;引起了轰动&#xff0c;不久之后&#xff0c;似乎每个人都发现了 ChatGPT 和 DALL-E 等生成式 AI 系统的新的创新用途。世界各地的企业开始呼吁将其集成到他们的产品中&#xff0c;并寻找使用它来提高组织效率的方法…

Spring Cloud Gateway 路由构建器的源码分析

Spring Cloud Gateway 路由构建器的源码分析 文章目录 1. 路由构建器的入口2. 创建路由规则3. 设置路由规则和属性4. 路由过滤器的设置5. 构建和获取路由规则&#xff1a;6. 实例化路由构建器&#xff1a;8. 路由构建器的源码分析8.1 RouteLocator接口8.2 RouteLocatorBuilder…

漏刻有时地理信息系统LOCKGIS小程序配置说明(web-view组件、服务器域名配置、复制链接和转发功能)

漏刻有时地理信息系统说明文档(LOCKGIS、php后台管理、三端一体PC-H5-微信小程序、百度地图jsAPI二次开发、标注弹窗导航)漏刻有时地理信息系统LOCKGIS小程序配置说明(web-view组件、服务器域名配置、复制链接和转发功能)漏刻有时地理信息系统LOCKGIS主程序配置说明(地图调起弹…

【面试经典150 | 栈】有效的括号

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;栈哈希表 其他语言cpython3 写在最后 Tag 【栈】 题目来源 20. 有效的括号 题目解读 括号有三种类型&#xff0c;分别是小括号、中括号和大括号&#xff0c;每种括号的左右两半括号必须一一对应才是有效的括号&#…

react 中获取多个input输入框中的值的 俩种写法

目录 1. 使用受控组件 2. 使用非受控组件 1. 使用受控组件 这是React中最常见的方法&#xff0c;每个输入框都与React组件的state相关联&#xff0c;并通过onChange事件来更新state。 代码示例&#xff1a; import React, { Component } from react;class MultipleInputExam…

机器人SLAM与自主导航

机器人技术的迅猛发展&#xff0c;促使机器人逐渐走进了人们的生活&#xff0c;服务型室内移动机器人更是获得了广泛的关注。但室内机器人的普及还存在许多亟待解决的问题&#xff0c;定位与导航就是其中的关键问题之一。在这类问题的研究中&#xff0c;需要把握三个重点&#…

安卓使用android studio跨进程通信之AIDL

我写这篇文章不想从最基础的介绍开始,我直接上步骤吧. 1.创建服务端 1.1:创建服务端项目:我的as版本比较高,页面就是这样的 1.2:创建AIDL文件,右键项目,选中aidl aidl名字可以自定义也可以默认 basicTypes是自带的,可以删掉,也可以不删,然后把你自己所需的接口写上去 1.3:创建…

5、Kafka集成 SpringBoot

SpringBoot 是一个在 JavaEE 开发中非常常用的组件。可以用于 Kafka 的生产者&#xff0c;也可以 用于 SpringBoot 的消费者。 1&#xff09;在 IDEA 中安装 lombok 插件 在 Plugins 下搜索 lombok 然后在线安装即可&#xff0c;安装后注意重启 2&#xff09;SpringBoot 环境准…

Vue 3.0中Treeshaking特性是什么?

一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除无用的代码 如果把代码打包比作制作蛋糕&#xff0c;传统的方式是把鸡…

VTK8.0.0编译+QT5.9.2+VS2017

背景 VTK网上资料较多并且使用较多的版本可能是VTK8.2.0&#xff0c;但是由于之前先配置了QT 5.9.2 msvc2017 PCL1.8.1 VTK8.0.0环境&#xff0c;听说有人PCL1.8.1配置VTK8.2.0实测版本不兼容&#xff0c;需修改源码调试&#xff0c;比较麻烦&#xff0c;所以之前就使用的VT…

Unity 中3D数学基础-向量

本文主要全面讲解向量的数学运算已经对应的实际应用意义! 1.向量的认识 向量(矢量) 有1、2、3维! 向量既可以表示大小也可以表示方向,也可以表示一个空间坐标点!因此他虽然是一个数学数字表示,但是实际空间意义有这三种! 坐标点A(x,y,z) 表示与原点连线构成的方向…

前端常见的数据类型有哪些?

在前端开发中,常见的数据类型包括: 1:字符串(String):表示文本数据,用引号(单引号或双引号)括起来,例如:“Hello, World!”。 创建字符串:let str = ‘Hello, World!’;获取字符串长度:let length = str.length;字符串拼接:let newStr = str1 + str2;2:数字(N…

SystemVerilog(2)——数据类型

一、概述 和Verilog相比&#xff0c;SV提供了很多改进的数据结构。它们具有如下的优点&#xff1a; 双状态数据类型&#xff1a;更好的性能&#xff0c;更低的内存消耗队列、动态和关联数组&#xff1a;减少内存消耗&#xff0c;自带搜索和分类功能类和结构&#xff1a;支持抽…

微信小程序之首页-后台交互及WXS的使用

目录 前言 一. 前后台数据交互及封装request 1.准备后台 1.1 配置数据源 1.2 部分后台获取数据方法编写 2.准备前端 2.1封装Request 2.2 前端JS方法编写 2.3 前端页面展示index.wxml 二.WXS的使用 1.简介 2.WXS优化OA系统 2.1 使用及定义 2.2 导入要使用的项目 2.…

【代码随想录第45天】动态规划5

代码随想录第45天| 动态规划5 1049. 最后一块石头的重量 II494. 目标和474.一和零 1049. 最后一块石头的重量 II LeetCode题目&#xff1a;1049. 最后一块石头的重量 II 代码随想录&#xff1a;1049. 最后一块石头的重量 II 思路就是尽量把石头分成重量总和相等的两堆&#xff…