贪心策略取得最优解的条件_什么是贪心算法?

一、什么是贪心算法

贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。(局部最优解,而不是整体最优解)

贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性(即某个状态以后的过程不会影响以前的状态,只与当前状态有关。)所以,对所采用的贪心策略一定要仔细分析其是否满足无后效性。

二、贪心算法基本思路

把求解的问题分成若干个子问题

对每个子问题求解,得到子问题的局部最优解(不能保证求得的最后解是最佳的)

把子问题的解局部最优解合成原来问题的一个解

可以看出贪心算法和动态规划非常相似,但是两者存在部分区别

1)贪心算法每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留。而动态规划全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解。

2)贪心算法只能求满足某些约束条件的可行解的范围。

3)贪心不能保证求得的最后解是最佳的,一般复杂度低。而动态规划本质是穷举法,可以保证结果是最佳的,复杂度高。

三、经典例题

1)指定币值和相应的数量,用最少的数量凑齐某金额

思路:优先选择面值大的钱币,以此类推,直到凑齐总金额

public int[] getCoinNum(int sum, int[] values, int[] counts) {    int[] result = new int[values.length];    int add = 0;    for (int i = values.length - 1; i >= 0; i--) {        int num = (sum - add) / values[i];        if (num > counts[i]) {            num = counts[i];        }        add = add + num * values[i];        result[i] = num;    }        return result;}

2)部分背包问题,物品可以不完全放入包中,求价值最大的方案

思路:选择单位重量价值最高的物品,将尽可能多的该物品装入背包,直到背包装满为止。

public float getNum(float M, float[] w, float[] v) {    float max = 0;    float weight = 0;        for (int i = 0; i < w.length; i++) {        if (v[i] / w[i] > max) {            max = v[i] / w[i];            weight = w[i];        }    }    float num = M / weight;    return num;}
140372843f6613e9b47ea9da890ece53.png

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

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

相关文章

Devoxx第1天

参加Devoxx给我带来了足够的动力来发布我的第一篇博客文章。 我是第一次来这里&#xff0c;它的组织方式给我留下了深刻的印象。 目前有记录的最高发言人。 对我来说&#xff0c;选择演示文稿来参加是一个问题。 但是感谢组织者&#xff0c;所有活动都将在12月下旬在parleys.co…

Oracle 事务的开始与结束

事务是用来分割数据库活动的逻辑工作单元&#xff0c;事务即有起点&#xff0c;也有终点&#xff1b; 事物的处理就是保证数据操作的完整性&#xff0c;所有的操作要么成功要么同时失败。当下列事件之一发生时&#xff0c;事务就开始了&#xff1a;连接到数据库上&#xff0c;并…

http tcp联系区别

术语TCP/IP代表传输控制协议/网际协议&#xff0c;指的是一系列协议。“IP”代表网际协议&#xff0c;TCP和UDP使用该协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路&#xff0c;它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车…

python控件随窗口变化而适配_Tkinter窗口/控件比例调整

我目前正在为一个编程类开发一个pythongui版本的Reversi。我已经对游戏逻辑进行了编程&#xff0c;目前我正在尝试使用Tkinter实现GUI。我有一些问题&#xff0c;调整游戏板(根窗口)和它的一切(画布和形状)成比例。这款游戏目前还不错&#xff0c;但我试图让棋盘正确调整大小的…

Java递归基础

对于那些不知道递归是什么的人&#xff08;并且像个笑声一样&#xff09;&#xff0c;请单击以下链接&#xff1a;Google搜索&#xff1a;递归&#xff0c;然后单击“您的意思是……”项。 希望您终于弄清楚了递归是指其自身的任何内容&#xff08;如果不是&#xff0c;那么您可…

我是最棒的,我一定会成功!

有人曾经做过这样一个实验&#xff1a;他往一个玻璃杯里放进一只跳蚤&#xff0c;发现跳蚤立即轻易地跳了出来。再重复几遍&#xff0c;结果还是一样。根据测试&#xff0c;跳蚤跳的高度一般可达它身体的400倍左右&#xff0c;所以说跳蚤可以称得上是动物界的跳高冠军。     …

头部ct能检查出什么_【安全用药】做CT检查时应注意什么?

点击蓝字 关注我们安安徽徽&#xff0c;你知道做CT检查时应注意什么&#xff1f;上腹部CT检查前患者至少禁食6小时、检查前15分钟喝温开水充盈胃部、CT检查时&#xff0c;患者会受到一定量X射线辐射&#xff0c;应避免过度扫描......本期安全用药&#xff0c;大家一起来了解了解…

JAXB,SAX,DOM性能

这篇文章探讨了使用多种不同方法将XML文档编组为Java对象的性能。 XML文档非常简单。 它包含一个Person实体的集合。 <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <persons><person><id>person0</id>…

虚拟机Linux图形界面配置NAT-桥接

点开“虚拟机->设置->桥接模式&#xff08;勾选复制物理网络连接状态&#xff09;->确认” 点击“右上角扇形网络图标->Edit Connections->Wired->选中->Delete->Add->IPv4 Settings->Method(Manual)->Add->输入IP&#xff0c;子网掩码&am…

年轻人应该谨记的十点

有个朋友的孩子今年大学毕业&#xff0c;托我帮他找个“好工作”&#xff0c;而且再三强调&#xff0c;这关系到孩子的前途命运&#xff0c;要我一定要全力以赴。他&#xff0c;一个非名牌大学的计算机网络专业应届毕业生&#xff0c;没有工作经验&#xff0c;他能找一个什么样…

python自动化构建工具_Python自动化构建工具scons使用入门笔记

这段时间用到了scons&#xff0c;这里总结下&#xff0c;也方便我以后查阅。一、安装sconsLinux环境(以CentOS为例)1、yum安装yum install scons2、源码安装下载scons&#xff1a;http://http://jaist.dl.sourceforge.net/project/scons/scons/2.3.0/scons-2.3.0.zip安装scons&…

Java 8状态更新

即将到来的Java SE 8发行版的两大新语言功能是Lambda Expressions和Modularity。 对于这两者&#xff0c;这些天的状态更新已经发布。 我会与您共享链接&#xff0c;因此您可能会在假期中通读它们 Oracle计划在2013年中期发布Java SE 8。 Lambda项目 Lambda项目以及JSR-335希望…

java 18 - 6 TreeMap嵌套使用

HashMap嵌套HashMap   动物     犬类         哈士奇   2         萨摩耶   1     猫类        波斯猫   2        加菲猫   3 先存储元素&#xff0c;然后遍历元素 1 package map_son;2 3 import java.util.HashMap;4 import…

程序设计语言

程序设计语言使用于书写计算机程序的语言。程序设计语言有3个方面的因素&#xff0c;即语法&#xff0c;语义和语用。语法标识程序的结构或形式。语义表示程序的含义。语用表示程序与使用者的关系。 程序设计语言的发展史 程序的复杂性度量 1&#xff0c;代码行度量法 出错率&a…

python集合类型是一种具体的数据类型_Python3基础语法之集合类型

set也是一种组合数据类型&#xff0c;支持成员关系操作(in)、对象大小计算操作符(len())&#xff0c;并且是iterable。集合数据类型至少提供一个set.isdisjoin()方法&#xff0c;支持比较&#xff0c;也支持为逻辑操作(在集合用于联合、交叉等上下文中使用)。只有可哈希运算的对…

Linux 安装之U盘引导

说到装系统最简单的方法无非就是找个系统安装光盘来然后就一步一步慢慢的安装。简单是简单但好似大多数人好像都木有Linux的安装光盘。因此只能用U盘来模拟光盘的功能来装系统咯。 电脑上装有Windows 7现要装Linux变双系统。 安装Linux前的准备&#xff1a; 1、电脑上分出空闲的…

OSGi:简介

为基于Java的系统创建的OSGi提供了模块化系统的框架。 OSGi使得可以定义每个单独模块与其他模块的依赖关系&#xff0c;并使用户可以控制生命周期并动态更改系统的每个组件。 OSGi是一个规范&#xff0c;最常见的实现可以算作Equinox &#xff0c; Apache Felix和Knoplerfish 。…

一起动手打造个人娱乐级linux

我们使用电脑&#xff0c;一直以来用的都是windows&#xff0c;但是对于像我这种爱折腾的人来说&#xff0c;尝试使用linux系统应该是一种不错的体验。说到linux&#xff0c;许多人可能都没听过&#xff0c;或者知道的人对它印象是这样的&#xff1a; 然而&#xff0c;linux发展…

PostgreSQL数据类型

http://blog.csdn.net/neo_liu0000/article/details/6254086 第六章 数据类型 6.1概述 PostgreSQL 提供了丰富的数据类型。用户可以使用 CREATE TYPE 命令在数据库中创建新的数据类型。PostgreSQL 的数据类型被分为四种&#xff0c;分别是基本数据类型、复合数据类型、域和伪类…

centos 卸载ffmpeg_CentOS Linux 操作系统安装 FFmpeg 教程

FFmpeg 是一个非常热门的开源项目&#xff0c;用来编解码音频视频流&#xff0c;被广泛用于各种流服务中。本教程在 CentOS 6、7、8 上面都可以使用&#xff0c;用来安装 FFmpeg 软件。一、安装前需求一个 sudo 账户&#xff0c;一般都是默认 root 账户即可。1、CentOS 8安装所…