【趣学算法】Day2 贪心算法——最优装载问题

news2025/1/13 11:43:36

14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!

❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️

🧑个人主页:@周小末天天开心

各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力

感谢!

📕该篇文章收录专栏—趣学算法


目录

一、贪心算法

(1)介绍

(2)注意事项

(3)性质

1)贪心选择

2)最优子结构

二、最优装载问题

(1)古董重量排序

(2)贪心策略选择

模板代码

(1)分析

(2)伪代码

代码优化

(1)分析

(2)伪代码

三、 程序实现


一、贪心算法

(1)介绍

贪心算法总是做出当前最好的选择,期望通过局部最优解选择,从而得到全局最优的解决方案。

(2)注意事项

1)一旦做出选择,就不可以回溯。

2)有可能得不到最优解,而是得到最优解的近似值。

3)选择什么样的贪心策略直接决定了算法的好坏。

(3)性质

        人们通过实践发现,利用贪心算法求解的问题往往具有两个重要的性质:贪心选择和最优子结构。只要满足这两个性质,就可以使用贪心算法。

1)贪心选择

        贪心选择是指原问题的整体最优解可以通过一系列局部最优的选择得到:先做出当前最优的选择,将原问题变为一个相似却规模更小的子问题,而后的每一步都是当前最优的选择。这种选择依赖于已做出的选择,但不依赖于未做出的选择。

2)最优子结构

        最优子结构是指原问题的最优解包含子问题的最优解。贪心算法通过一系列的局部最优解(子问题的最优解)得到全局最优解(原问题的最优解),如果原问题的最优解和子问题的最优解没有关系,则求解子问题没有任何意义,无法采用贪心算法。


二、最优装载问题

        海盗们截获一艘装满各种各样古董的货船,每一件古董都价值连城,但一旦打碎就会失去其原有的价值。海盗船虽然足够大,但载重量是有限的。海盗船的载重量为W,每件古董的重量为wi,如何才能把尽可能多的古董装上海盗船呢。

(1)古董重量排序

海盗船的载重量w为30。

排序前的古董重量为:

w[i] = {4, 10, 7, 11, 3, 5, 14, 2};

排序后的古董重量为:

w[i] = {2, 3, 4, 5, 7, 10, 11, 14};

(2)贪心策略选择

按照贪心策略,每次选择重量最小的古董装入海盗船(tmp代表已装入的古董重量,ans代表已装入的古董重量)。

1)选择排序后的第1个古董,装入重量tmp = 2,没有超出载重量,ans = 1;

2)选择排序后的第2个古董,装入重量tmp = 2 + 3 = 5,没有超出载重量,ans = 2;

3)选择排序后的第3个古董,装入重量tmp = 5 + 4 = 9,没有超出载重量,ans = 3;

4)选择排序后的第4个古董,装入重量tmp = 9 + 5 = 14,没有超出载重量,ans = 4;

5)选择排序后的第5个古董,装入重量tmp = 14 + 7 = 21,没有超出载重量,ans = 5;

6)选择排序后的第6个古董,装入重量tmp = 21 + 10 =31,没有超出载重量,ans = 6;

当第六次装入古董时可以发现已经超出了船的载重量,所以古董最多装ans = 5个


模板代码

(1)分析

        首先使用变量ans记录装入海盗船的古董数量,并使用变量tmp暂存装入海盗船的古董重量。然后依次检查每个古董,对tmp加上改古董的重量,如果小于或的等于载重w,责令ans++,否则退出。

(2)伪代码

int solve1(int n,double W){
	double tmp=0.0;//tmp为已装载到船上的古董重量
    int ans=0; //ans为已装载的古董个数,初始化为0
    for(int i=0;i<n;i++){
        tmp+=w[i];
        if(tmp<=W)
            ans++;
        else
            break;
    }
    return ans;
} 

代码优化

(1)分析

实际上,不需要在每次判断是否超出载重时执行ans++,而是可以初始化ans = n。如果已装入海盗船的古董重量tmp大于或等于载重量w,则判断是否刚好等于载重量w并令ans = i + 1,否则令ans = i并退出。这样就只有最后一次才满足条件,ans只需要赋值一次即可,或者所有古董都被装入(初始值n)。

(2)伪代码

int solve2(int n,double w){//优化算法 
	double tmp=0.0;//tmp为已装载到船上的古董重量
	int ans=n; //ans为已装载的古董个数,初始化为n
    for(int i=0;i<n;i++){
        tmp+=w[i];
        if(tmp>=w){//最后一次才满足条件 
        	if(tmp==w)
        		ans=i+1;
        	else
        		ans=i;
        	break;
		}     
    }
    return ans;
}

三、 程序实现

注:程序由Java语言实现

public class algorithm02 {
    public static void main(String[] args) {
        int[] w = {4, 10, 7, 11, 3, 5, 14, 2};
        int W = 30; // 船的载重量
        int temp;
        for (int i = 0; i < w.length-1; i++) {
            for (int j = 0; j < w.length - i - 1; j++) {
                if (w[j] > w[j + 1]) {
                    temp = w[j];
                    w[j] = w[j + 1];
                    w[j + 1] = temp;
                }
            }
        }
        System.out.println("古董重量排序后为:");
        for (int j = 0; j < w.length; j++) {
            System.out.print(w[j] + " ");
        }
            add02 a2 = new add02();
            int ans = a2.solve2(8 , W , w);
            System.out.println("\n总共装入了" + ans + "个古董");
    }
}

// add02类
public class add02 {
    public int solve2(int n , int W ,int w[]){//优化算法
        double tmp = 0.0;//tmp为已装载到船上的古董重量
        int ans = 0; //ans为已装载的古董个数,初始化为n
        for(int i = 0; i < n; i++){
            tmp += w[i];
            if(tmp >= W){//最后一次才满足条件
                if(tmp == W)
                    ans = i+1;
                else
                    ans = i;
                break;
            }
        }
        return ans;
    }
}

 得到结果为:

因为船的载重量为30,所以在装入第五个古董后就无法装入第六个了。

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

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

相关文章

ESP8266/esp32接入阿里云物联网平台点灯控制类案例

ESP8266/esp32接入阿里云物联网平台点灯控制类案例&#x1f4cc;阿里云物联网云平台介绍&#xff1a;https://help.aliyun.com/product/30520.html &#x1f38b;需要自己在阿里云物联网云平台注册自己的账户&#xff0c;这里不做介绍了。 &#x1f33b;阿里云物联网云平台创建…

Python基础入门(持续更新中)

一、发展历程 Python的创始人为荷兰人吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。1989年圣诞节期间&#xff0c;在阿姆斯特丹&#xff0c;Guido为了打发圣诞节的无趣&#xff0c;决心开发一个新的脚本解释程序&#xff0c;作为ABC语言的一种继承。之所以选中单词P…

CANoe-以太网软硬件网络自动映射的问题

以太网软硬件网络自动映射的问题 当我们设置CANoe以太网模式为Network-based access模式时 我们需要在CANoe硬件里配置segment,具体内容请参考文章《如何配置CANoe Network-based access模式的以太网网络拓扑》 有时我们图省事,配置的segment默认名称是什么,我们也不管,也…

UVM如何处理out-of-order乱序传输

文章目录前言1、基本思路2、支持乱序传输的sequence3、支持乱序传输的Driver总结前言 乱序传输(out-of-order)是指在协议中&#xff0c;后发出去的req&#xff0c;支持先回resp&#xff0c;通常通过ID来保证req和resp之间的关系。很多协议支持乱序传输&#xff0c;例如AXI4。本…

我们简单的new了一个对象,JVM都做了哪些贡献?

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章是关于CAS的介绍以及在我们new对象时&#xff0c;Java虚拟机会为我们做些什么贡献。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适合复…

【C++笔试强训】第九天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6; &…

基于骨骼的动作识别:PoseConv3D

Revisiting Skeleton-based Action Recognition解读摘要1. 简介2. Related Work2.1 基于3D-CNN的rgb视频动作识别2.2 基于GCN的骨骼动作识别2.3 基于CNN的骨骼动作识别3. Framework3.1 Pose Extraction3.2 From 2D Poses to 3D Heatmap Volumes3.3 基于骨骼的动作识别3D-CNN3.3…

智能的逻辑与理性的逻辑是不同的逻辑

1.世界是由事实和价值共同组成的1.1 事实由对象、事态及其联系&#xff08;如语言&#xff09;构成1.2 价值是事实在实践中的作用和效果构成1.3 事实中存在着决定论&#xff0c;价值里包含有自由意志1.3.1 事实反映有无&#xff0c;价值反映好坏1.4 每一个事实都具有变价值&…

8.2 从堆中绕过SafeS.E.H

一、实验环境 操作系统&#xff1a;windows XP SP2&#xff08;关闭DEP&#xff09; 软件版本&#xff1a;VS2008&#xff08;release&#xff09;、原版OD&#xff08;实时调试&#xff09; 二、实验代码 #include <stdafx.h> #include <stdlib.h> #include <…

计算机操作系统引论(操作系统)

目录 一、操作系统的目标 二、操作系统的作用 三、操作系统的基本特性 四、操作系统的主要功能 五、操作系统的结构设计 一、操作系统的目标 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是计算机硬件的第一层软件&#xff0c;是计算机必备配置的最基…

接口自动化测试(二)—— Postman实现接口测试

其他 接口自动化测试 知识参考&#xff1a;接口自动化测试 目录 一、Postman介绍和安装 1、简介 2、安装 3、安装Postman插件newman 二、Postman基本用法 1、案例一 2、案例二 三、Postman高级用法 1、管理测试用例Collections 1.1、创建 collections 1.2、创建 用…

libusb系列-002-Windows下libusb源码编译

libusb系列-002-Windows下libusb源码编译 文章目录libusb系列-002-Windows下libusb源码编译摘要Windows下编译libusb库下载源码进入msvc目录选择对应的项目工程编译查看编译好的库文件关键字&#xff1a; vs、 编译、 Qt、 libusb、 windows内容背景&#xff1a; 最近项目终于切…

从 0 到 1 落地前端工程化

你将获得 初识&#xff1a;总结前端工程化技能图谱 了解&#xff1a;梳理前端工程化落地流程 掌握&#xff1a;搭建前端工程化基建项目 提高&#xff1a;实战前端工程化解决方案 作者介绍 JowayYoung&#xff0c;资深前端工程师&#xff0c;目前就职于网易互动娱乐事业群&…

建立私人知识网站 cpolar轻松做到1 (部署DokuWiki)

维基百科&#xff08;wiki&#xff09;相信大家都有所耳闻&#xff0c;作为全球最有名的百科知识搜索网站&#xff0c;很多不常见的知识点都能在这上面搜索到&#xff0c;而维基百科能够成功的原因&#xff0c;就是可以编辑的和修订的功能&#xff0c;让维基百科能够收到各领域…

vue学习笔记——简单入门总结(一)

Vue学习笔记 文章目录Vue学习笔记1. 学习vue的准备1.1. vue简介:1.2. vue特点:1.2.1. 组件化&#xff1a;1.2.1. 声明式&#xff1a;1.2. vue的引入1.2.1. 直接引入&#xff1a;1.2.2. 脚手架构建vue项目&#xff1a;1.2.3&#xff1a;vue开发插件安装&#xff1a;2. vue的简单…

apache服务web页面执行shell脚本

首先安装apache服务 yum -y install httpd 如下介绍两种执行的方式 方式一、url直接传参的方式 #cat /var/www/cgi-bin/shell #!/bin/sh printf "Content-Type: text/plain\n\n" your_commands_here传参的动作 http://172.16.61.119:8098/cgi-bin/shell?pwd在…

STM32使用寄存器开发底层驱动学习(USART+DMA)

目录学习资料下载任务USART的DMA功能发送数据DMA非中断模式接收USART数据。DMA中断模式接收USART数据总结学习资料下载 在本文学习中会用到如下的文档资料&#xff0c;没有的朋友先下载。 工程模板 Cortex M3权威指南&#xff08;中文&#xff09; &#xff1a;本文简称为《…

1024程序节|你知道老师上课随机点名是怎么实现的吗

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 目录 前言 随机点名 搭建主体框架 简述 执行代码 添加功能 块级元素随机输出姓名 Math.random() Math.round() 按钮控制开始/结束 onclick() clearInterval() 简述 完整代码 执行结果 片…

I/O复用--浅谈epoll

我们聊了聊select和poll知道&#xff1a; 它们都是采取轮询的方式查找是否有就绪描述符。都有数据结构从用户态拷贝到内核态&#xff0c;内核态拷贝到用户态这个过程。 为了针对许多大量连接&#xff0c;高并发的的场景下大量的资源消耗&#xff0c;效率低的问题&#xff0c;这…

网络安全实战:记一次比较完整的靶机渗透

0x01信息搜集 nmap -sC -sV -p- -A 10.10.10.123 -T4 -oA nmap_friendzone访问80端口的http服务只发现了一个域名。 0x02 DNS区域传输 因为我们前面扫描的时候发现了53端口是开着一个dns服务的&#xff0c;所以尝试使用friendzoneportal.red进行axfr&#xff0c;它的具体含…