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

贪心算法和动态规划

 

目录

一、简介

二、贪心算法案例:活动选择问题

1.原理介绍

三、动态规划案例:背包问题

1.原理介绍

四、贪心算法与动态规划的区别

五、总结


作者其他文章链接

正则表达式-CSDN博客

深入理解HashMap:Java中的键值对存储利器-CSDN博客

3487b068035547f2af4e91994cfb3910.png

 

一、简介

贪心算法和动态规划是两种非常强大的算法设计策略,它们在许多复杂问题中都展现出了出色的性能。在计算机科学中,它们被广泛应用于解决优化问题,如资源分配、路径寻找等。在这篇博客中,我们将通过具体的Java案例来探讨这两种算法的设计和应用,并详细比较它们的区别。

 

二、贪心算法案例:活动选择问题

1.原理介绍

贪心算法是一种通过每一步的最优选择,希望得到全局最优解的算法。它通常基于当前状态和局部信息做出决策,而没有对问题进行全面的扫描和分解。贪心算法的关键在于在每一步选择中,都选取当前状态下最好或最优(即最有利)的选择,从而希望通过每个局部最优的选择,能够导致全局最优解。

活动选择问题是一种常见的贪心算法应用场景,它要求从一系列活动中选择出最大数量的活动,以便在给定时间内完成。贪心算法的策略是每次选择当前最优的活动,希望通过每个局部最优的选择,能够达到全局最优解

public class ActivitySelection {  public static int selectActivities(int[] activityLengths, int[] activityStartTimes) {  int n = activityLengths.length;  int[] dp = new int[n];  int maxActivities = 0;  for (int i = 0; i < n; i++) {  int start = activityStartTimes[i];  int end = start + activityLengths[i];  for (int j = 0; j < i; j++) {  if (activityStartTimes[j] <= start && end <= activityStartTimes[j] + activityLengths[j]) {  dp[i] = 0; // conflict  break;  } else if (activityStartTimes[j] > start && end > activityStartTimes[j] && dp[j] == 1) {  dp[i] = 0; // conflict  break;  } else if (activityStartTimes[j] <= start && end >= activityStartTimes[j] + activityLengths[j]) {  dp[i] = 1; // OK  } else {  dp[i] = 0; // conflict  }  }  if (dp[i] == 1) {  maxActivities++;  }  }  return maxActivities;  }  
}

 

三、动态规划案例:背包问题

1.原理介绍

动态规划是一种通过将问题分解为若干个子问题,并存储子问题的解,以便重复使用的方法。它特别适用于解决需要优化递归的问题,通过将问题分解为更小的部分,并利用这些子问题的解来构建最终的解决方案。动态规划的关键在于记忆化,它通过存储并重复使用之前子问题的解,从而避免重复计算,提高了算法的效率。

背包问题是动态规划的经典案例。我们有一个背包,有一定的承载重量,现在有一些物品,每个物品都有自己的重量和价值。我们希望在不超过背包承载重量的前提下,选择一些物品放入背包,使得背包中物品的总价值最大。我们可以将这个问题分解为几个子问题:对于给定的背包容量,我们能选择哪些物品?对于这些物品,我们应该选择哪些物品放入背包以获得最大的价值?

public class Knapsack {  public static int knapSack(int W, int wt[], int val[], int n) {  int i, w;  int K[][] = new int[n+1][W+1];  for (i = 0; i <= n; i++) {  for (w = 0; w <= W; w++) {  if (i==0 || w==0) {  K[i][w] = 0;  } else if (wt[i-1] <= w) {  K[i][w] = Math.max(val[i-1] + K[i-1][w-wt[i-1]],  K[i-1][w]);  } else {  K[i][w] = K[i-1][w];  }  }  }  return K[n][W];  }  
}

四、贪心算法与动态规划的区别

  1. 问题分解方式:贪心算法通常试图找到局部最优解,希望通过每个局部最优的选择,能够达到全局最优解。它通常没有对问题进行全面扫描和分解,而是基于当前状态和局部信息做出决策。而动态规划则是将问题分解为若干个子问题,并存储子问题的解,以便重复使用。它通过将问题分解为更小的部分,并利用这些子问题的解来构建最终的解决方案。
  2. 记忆化:动态规划的一个重要特点是记忆化。它通过存储并重复使用之前子问题的解,从而避免重复计算,提高了算法的效率。而贪心算法则通常没有这种记忆功能,它只关注当前状态和局部最优解。
  3. 全局优化:贪心算法通常只能保证局部最优,而无法保证全局最优。这是因为贪心算法在每一步都选择当前最优的选项,而不考虑这可能对全局产生的影响。而动态规划则通过解决子问题并整合答案,更有可能找到全局最优解。
  4. 适用场景:贪心算法在某些特定类型的问题上表现出色,例如活动选择、硬币找零等问题。而动态规划则更适用于解决复杂优化问题,如背包问题、旅行商问题等。
  5. 时间复杂度:在某些情况下,动态规划的时间复杂度可能高于贪心算法。这是因为动态规划需要解决和存储大量的子问题,而贪心算法则只需要考虑当前状态和局部信息。然而,对于一些特定问题,动态规划可能会提供更优的解决方案。

五、总结

贪心算法和动态规划是两种非常强大的算法设计策略,它们在许多复杂问题中都展现出了出色的性能。通过以上两个Java案例,我们可以看到它们在解决实际问题中的效果和优势。在选择使用贪心算法还是动态规划时,我们需要根据问题的性质、全局优化要求、计算资源等因素进行综合考虑。同时,深入理解这两种算法的工作原理和适用场景,将有助于我们在解决问题时选择合适的算法设计策略。

 

 

相关文章:

贪心算法和动态规划

目录 一、简介 二、贪心算法案例&#xff1a;活动选择问题 1.原理介绍 三、动态规划案例&#xff1a;背包问题 1.原理介绍 四、贪心算法与动态规划的区别 五、总结 作者其他文章链接 正则表达式-CSDN博客 深入理解HashMap&#xff1a;Java中的键值对存储利器-CSDN博客…...

jsp 设备预约管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 设备预约管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…...

Python:核心知识点整理大全10-笔记

目录 5.4 使用 if 语句处理列表 5.4.1 检查特殊元素 toppings.py 5.4.2 确定列表不是空的 5.4.3 使用多个列表 5.5 设置 if 语句的格式 5.6 小结 第6章 字 典 6.1 一个简单的字典 alien.py 6.2 使用字典 6.2.1 访问字典中的值 6.2.2 添加键—值对 6.2.3 先创建一…...

Hive数据库系列--Hive数据类型/Hive字段类型/Hive类型转换

文章目录 一、Hive数据类型1.1、数值类型1.2、字符类型1.3、日期时间类型1.4、其他类型1.5、集合数据类型1.5.1、Struct举例1.5.2、Array举例1.5.3、Map举例 二、数据类型转换2.1、隐式转换2.2、显示转换 三、字段类型的使用3.1、DECIMAL(precision&#xff0c;scale) 本章主要…...

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok&#xff0c;在上篇文章中我们讲了在Spring cloud中使用Zuul网关&#xff0c;这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话&#xff0c;本篇博客就是配置子模块&#xff0c;或者说是微服务&#xff0c;然后将微服务正式启动之前…...

(JAVA)-缓冲流

缓冲流能高效的读取数据 缓冲流底层自带了8192的缓冲区提高性能&#xff0c;他在原有的流上进行了包装&#xff0c;加上了缓冲效果 原理&#xff1a; 读入时首先会将内存中缓冲区大小的数据读入缓冲区中&#xff0c;接着下次读取直接从缓冲区中读取数据&#xff0c;当缓冲区…...

Autosar UDS-CAN诊断开发02-1(CAN诊断帧格式类型详解、CANFD诊断帧格式类型详解、15765-2(CANTP层)的意义)

目录 前言 CANTP层&#xff08;15765-2协议&#xff09;存在的意义 CANTP层&#xff08;15765-2协议&#xff09;帧类型详细解读&#xff08;普通CAN格式&#xff09; 四种诊断报文类型 单帧SingleFrame(SF) 首帧&#xff1a;FirstFrame(FF) 流控帧&#xff1a;FlowCont…...

swing快速入门(三)

解答一下上一篇关于留下的关于布局管理器的疑问 上一篇 几种常见的布局管理器 看不懂&#xff1f;看不懂没关系&#xff0c;这篇是概念篇&#xff0c;大概了解一下就行~ 1.FlowLayout&#xff08;流式布局&#xff09;&#xff1a;按照从左到右、从上到下的顺序依次排列组件。…...

Swagger PHP Thinkphp 接口文档

安装 1. 安装依赖 composer require zircote/swagger-php 2. 下载Swagger UI git clone https://github.com/swagger-api/swagger-ui.git 3. 复制下载好的Swagger UI 中的dist目录到public目录中&#xff0c;修改目录名称 cp -rf swagger-ui/dist /home/htdocs/public/ m…...

12.9每日一题(备战蓝桥杯循环结构)

12.9每日一题&#xff08;备战蓝桥杯循环结构&#xff09; 题目 2165: 求平均年龄题目描述输入输出样例输入样例输出来源/分类 题解 2165: 求平均年龄题目 2166: 均值题目描述输入输出样例输入样例输出来源/分类 题解 2166: 均值题目 2167: 求整数的和与均值题目描述输入输出样…...

与时代共进退

还记得当初自己为什么选择计算机&#xff1f; 当初你问我为什么选择计算机&#xff0c;我笑着回答&#xff1a;“因为我梦想成为神奇的码农&#xff01;我想像编织魔法一样编写程序&#xff0c;创造出炫酷的虚拟世界&#xff01;”谁知道&#xff0c;我刚入门的那天&#xff0…...

Python 云服务器应用,Https,定时重启

Python 云服务器应用,Https,定时重启 环境搭建Python模块模块导入生成Flask实例GET处理启动服务器打开网页验证 GET接入证书 支持https申请证书下载证书保留 xxx.crt 和 xxx.key文件就可以了 copy到python项目目录ssl_context 配置 宝塔面板操作在www目录下新建python工作目录在…...

pytorch 笔记:dist 和 cdist

1 dist 1.1 基本使用方法 torch.dist(input, other, p2) 计算两个Tensor之间的p-范数 1.2 主要参数 input输入张量other另一个输入张量p范数 input 和 other的形状需要是可广播的 1.3 举例 import torchxtorch.randn(4) x #tensor([ 1.2698, -0.1209, 0.0462, -1.3271…...

Java的List中的各种浅拷贝和深拷贝问题

先来看一组代码 public class Temp{public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(1);list.add(2);list.add(3);List<Integer> temp list;list.add(4);System.out.println(list.toString());System.out.print…...

20231207_最新已测_Centos7.4安装nginx1.24.0_安装详细步骤---Linux工作笔记066

以前安装的太模糊了,干脆重新写一个: 1.首先下载对应的nginx-1.24.0.tar.gz安装文件 2.然后: 去执行命令 安装依赖 yum install -y gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel 3.然后:去解压 tar -zxvf ngi…...

前端知识笔记(二十六)———React如何像Vue一样将css和js写在同一文件

如果想在React中想要像Vue一样把css和js写到一个文件中&#xff0c;可以使用CSS-in-JS。 使用CSS-in-JS 下载 npm i styled-components使用 就像写scss一样&#xff0c;不过需要声明元素的类型 基本语法及展示如下 import styled from "styled-components"expor…...

Photoshop Circular Text

Ctrl N 新增 现学现卖...

深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正确使用

文章目录 1. 引言2. PathVariable&#xff1a;处理路径变量2.1 简介2.2 使用示例 3. RequestParam&#xff1a;处理请求参数3.1 简介3.2 使用示例 4. RequestBody&#xff1a;处理请求体4.1 简介4.2 使用示例 5. 多个注解的组合使用6. 参数绑定的原理6.1 HandlerMethodArgument…...

Qt Location中加载地图对象

在Qt Location中加载地图对象&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1&#xff0c;首先&#xff0c;确保你已经安装了Qt Location模块&#xff0c;并在项目中包含了相应的头文件。在项目文件&#xff08;.pro&#xff09;中添加以下行&#xff1a; QT locatio…...

4-Docker命令之docker ps

1.docker ps介绍 docker ps命令是用来列出容器的相关信息 2.docker ps用法 docker ps [参数] [rootcentos79 ~]# docker ps --helpUsage: docker ps [OPTIONS]List containersAliases:docker container ls, docker container list, docker container ps, docker psOptions…...

港科资讯|郑光廷教授出席国际科技组织发展与全球科技治理论坛 分享协作实践

2026年3 月 28 日&#xff0c;国际科技组织发展与全球科技治理论坛在北京中关村国际创新中心成功举办。香港科技大学副校长&#xff08;研究及发展&#xff09;郑光廷教授受邀出席并发表主题演讲&#xff0c;香港科大内地办(北京)主任袁冶老师一同参会&#xff0c;与中外嘉宾交…...

从稀疏点云到动态环境:八叉树地图在视觉SLAM中的核心构建与应用

1. 八叉树地图&#xff1a;视觉SLAM的"三维记事本" 想象一下你第一次走进一个陌生商场时的场景&#xff1a;眼睛快速扫描扶梯位置&#xff0c;大脑自动标记洗手间标识&#xff0c;同时避开行走的人群——这个过程本质上就是人类版的SLAM&#xff08;同步定位与地图构…...

3个步骤,让猫抓帮你轻松捕获网页视频资源

3个步骤&#xff0c;让猫抓帮你轻松捕获网页视频资源 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过这样的情况&#xff1f;在网…...

Anything to RealCharacters效果评测:与Stable Diffusion ControlNet写实方案对比

Anything to RealCharacters效果评测&#xff1a;与Stable Diffusion ControlNet写实方案对比 1. 项目概述 Anything to RealCharacters是一款专为RTX 4090显卡优化的2.5D转真人图像转换系统。这个工具基于通义千问Qwen-Image-Edit-2511图像编辑底座&#xff0c;集成了专门的…...

多模态Agent架构实战落地:从需求分析到生产部署

多模态Agent架构实战落地&#xff1a;从需求分析到生产部署 随着大语言模型技术的普及&#xff0c;单一文本交互的智能系统已无法满足复杂业务场景需求——电商平台需要同时理解用户的商品描述文本、实拍图片和售后语音诉求&#xff0c;教育场景需要处理手写作业、视频讲解和文…...

OpenCASCADE实战:如何正确获取3D模型面的法向(附完整代码示例)

OpenCASCADE实战&#xff1a;3D模型面法向的高效获取与方向校正 在三维建模与几何处理领域&#xff0c;准确获取模型表面的法向向量是许多高级操作的基础。无论是进行碰撞检测、光照计算还是有限元分析&#xff0c;法向数据的准确性直接影响最终结果的可靠性。OpenCASCADE作为一…...

深度解析:基于摄像头的远程生理监测工具箱rPPG-Toolbox实战指南

深度解析&#xff1a;基于摄像头的远程生理监测工具箱rPPG-Toolbox实战指南 【免费下载链接】rPPG-Toolbox rPPG-Toolbox: Deep Remote PPG Toolbox (NeurIPS 2023) 项目地址: https://gitcode.com/gh_mirrors/rp/rPPG-Toolbox 远程生理监测技术正在医疗健康领域引发革命…...

CasRel在智能问答系统中的落地实践:为QA引擎注入结构化事实支撑

CasRel在智能问答系统中的落地实践&#xff1a;为QA引擎注入结构化事实支撑 1. 引言&#xff1a;当问答系统遇到关系抽取 想象一下这样的场景&#xff1a;用户向智能问答系统提问"苹果公司的CEO是谁&#xff1f;"&#xff0c;系统需要快速准确地回答"蒂姆库克…...

4个维度解析Steam Achievement Manager:开源工具如何重塑游戏成就管理体验

4个维度解析Steam Achievement Manager&#xff1a;开源工具如何重塑游戏成就管理体验 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 一、困境诊断&#…...

3大技术突破重新定义魔兽地图编辑工作流

3大技术突破重新定义魔兽地图编辑工作流 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 对于《魔兽争霸III》地图制作者而言&#xff0c;最令人沮丧的体验莫过于&#xff1a;精心设计的地形布局在实际测试中…...