C#贪心算法

贪心算法:生活与代码中的 “最优选择大师”

在生活里,我们常常面临各种选择,都希望能做出最有利的决策。比如在超市大促销时,面对琳琅满目的商品,你总想用有限的预算买到价值最高的东西。贪心算法,就像是一个精明的生活顾问,总能在每一步都做出当下看起来最优的选择,帮我们在各种场景中找到 “最优解”。

贪心算法原理:目光短浅却很高效

贪心算法遵循一种 “今朝有酒今朝醉” 的策略,在对问题求解时,总是做出在当前看来是最好的选择。它并不从整体最优上加以考虑,所做出的仅仅是在某种意义上的局部最优解。但神奇的是,在很多情况下,这些局部最优解最后能构成全局最优解。

想象你在一个布满金币的房间,规定只能拿一次,每次拿一枚。贪心算法会让你在每一次伸手时,都选择眼前最大的那枚金币,而不考虑未来可能出现更大金币的情况。虽然看起来有点 “目光短浅”,但在合适的问题中,这种策略能高效地解决问题。

应用场景及代码实现

活动安排问题:时间管理大师的秘诀

假设你是一个忙碌的职场人,一天内有多个会议要参加,每个会议都有开始时间和结束时间,你想参加尽可能多的会议,该怎么选择呢?这就是活动安排问题。

贪心算法的策略是:优先选择结束时间最早的会议,只要这个会议的开始时间晚于前一个已选择会议的结束时间,就把它加入日程。

using System;
using System.Collections.Generic;
using System.Linq;
class Activity
{public int Start { get; set; }public int End { get; set; }public Activity(int start, int end){Start = start;End = end;}
}class GreedyAlgorithm
{public static List<Activity> ActivitySelection(List<Activity> activities){activities = activities.OrderBy(a => a.End).ToList();List<Activity> selectedActivities = new List<Activity>();selectedActivities.Add(activities[0]);int lastEnd = activities[0].End;for (int i = 1; i < activities.Count; i++){if (activities[i].Start >= lastEnd){selectedActivities.Add(activities[i]);lastEnd = activities[i].End;}}return selectedActivities;}
}class Program
{static void Main(){List<Activity> activities = new List<Activity>{new Activity(1, 3),new Activity(2, 5),new Activity(4, 6),new Activity(5, 7),new Activity(7, 9)};List<Activity> selected = GreedyAlgorithm.ActivitySelection(activities);Console.WriteLine("选择的活动:");foreach (var activity in selected){Console.WriteLine($"开始时间: {activity.Start}, 结束时间: {activity.End}");}}
}

找零问题:收银员的高效策略

当你去商店购物付款后,收银员需要找给你零钱。假设商店有各种面额的硬币和纸币,如何用最少的货币数量找零呢?

贪心算法的做法是:每次都优先选择面额最大的货币,直到找零金额为零。

using System;
using System.Collections.Generic;
class GreedyAlgorithm
{public static List<int> MakeChange(int amount, List<int> denominations){denominations = denominations.OrderByDescending(d => d).ToList();List<int> change = new List<int>();foreach (int denomination in denominations){while (amount >= denomination{amount -= denomination;change.Add(denomination);}}return change;}
}class Program
{static void Main(){int amount = 63;List<int> denominations = new List<int> { 25, 10, 5, 1 };List<int> change = GreedyAlgorithm.MakeChange(amount, denominations);Console.WriteLine("找零方案:");foreach (int coin in change){Console.Write(coin + " ");}}
}

背包问题(部分背包):灵活的背包打包法

在背包问题中,有一个容量有限的背包和一些物品,每个物品有重量和价值。部分背包问题允许你选择物品的一部分放入背包,目标是使背包内物品的总价值最大。

贪心算法的思路是:计算每个物品的价值重量比,优先选择价值重量比高的物品放入背包,直到背包装满。

using System;
using System.Collections.Generic;
using System.Linq;
class Item
{public int Weight { get; set; }public int Value { get; set; }public double ValuePerWeight => (double)Value / Weight;public Item(int weight, int value){Weight = weight;Value = value;}
}class GreedyAlgorithm
{public static double FractionalKnapsack(int capacity, List<Item> items){items = items.OrderByDescending(i => i.ValuePerWeight).ToList();double totalValue = 0;int currentWeight = 0;foreach (var item in items){if (currentWeight + item.Weight <= capacity){currentWeight += item.Weight;totalValue += item.Value;}else{int remainingCapacity = capacity - currentWeight;totalValue += item.ValuePerWeight * remainingCapacity;break;}}return totalValue;}
}class Program
{static void Main(){int capacity = 50;List<Item> items = new List<Item>{new Item(10, 60),new Item(20, 100),new Item(30, 120)};double maxValue = GreedyAlgorithm.FractionalKnapsack(capacity, items);Console.WriteLine($"背包能装下的最大价值: {maxValue}");}
}

贪心算法虽然在很多场景下表现出色,但它并非万能的。它的正确性依赖于问题本身具有的贪心选择性质和最优子结构性质。在实际应用中,需要仔细分析问题,判断贪心算法是否适用。要是你还想了解贪心算法在其他领域的应用,或者对代码实现有疑问,欢迎随时和我交流。

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

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

相关文章

3、Kubernetes 集群部署 Prometheus 和 Grafana

Kubernetes 集群部署 Prometheus 和 Grafana node-exporter 安装Prometheus 安装和配置Prometheus 配置热加载Grafana 安装部署Grafana 配置 实验环境 控制节点/master01 192.168.110.10 工作节点/node01 192.168.110.20 工作节点/node02 192.168.110.30 node-exporter 安装 #…

MySQL中Binlog Redolog Undolog区别?

MySQL中Binlog Redolog Undolog区别 在学习MySQL数据库管理和优化的过程中&#xff0c;理解和区分Binlog&#xff08;二进制日志&#xff09;、RedoLog&#xff08;重做日志&#xff09;和UndoLog&#xff08;撤销日志&#xff09;是至关重要的。这三种日志在MySQL中扮演着不同…

C++中结构体与结构体变量 和 类与对象的区别

具体区别如下&#xff1a; 结构体 -> 结构体变量 { 结构体&#xff1a;struct student{ 具体是多少&#xff0c;年龄&#xff0c;名字&#xff0c;性别&#xff0c;成绩 } 结构体变量&#xff1a; stu{ 名字&#xff1a;张三&#xff0c;年龄&#xff1a;18&#…

小迪安全23-php后台模块

cookie技术 cookie就是身份验证表示&#xff0c;通过cookie好区分每个用户的个人数据和权限&#xff0c;第一次登陆之后正常的网站都会赋予一个cookie 写写一个后台界面&#xff0c;直接让ai去写就可以 然后自己需要的提交方式&#xff0c;和表单值自己修改即可 生成cookie的…

(面试经典问题之连接池篇)连接池构成、作用及其基本原理详解

一、什么是连接池 连接池一般指的是数据库连接池&#xff08;connection pooling&#xff09;&#xff0c;是指程序启动时建立足够的数据库连接&#xff0c;并将这些连接组成一个连接池&#xff0c;由程序动态的对池中的连接进行申请&#xff0c;使用&#xff0c;释放&#xf…

Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今社会&#xff0c;随着人们生活水平的不断提高和健康意识的日益增强&#xff0c;健…

echarts找不到了?echarts社区最新地址

前言&#xff1a;在之前使用echarts的时候&#xff0c;还可以通过上边的导航栏找到echarts社区&#xff0c;但是如今的echarts变更之后&#xff0c;就找不到echarts社区了。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 如今…

Jenkins 配置 Credentials 凭证

Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind&#xff1a;凭证类型 Username with password&#xff1a; 配置 用…

【Nacos】从零开始启动Nacos服务(windows/linux)

文章目录 前言前置条件官方网址一、Nacos下载1.1 选择Nacos版本1.2 下载 二、解压2.1 解压到某个文件夹 三、 启动3.1 方式一&#xff1a;直接使用命令启动3.1.1 进入bin文件夹3.1.2 进入命令行工具3.1.3 执行命令 3.2 方式二&#xff1a;修改配置文件后启动3.2.1 修改启动脚本…

Microsoft 365 Copilot中使用人数最多的是哪些应用

今天在浏览Microsoft 365 admin center时发现&#xff0c;copilot会自动整理过去30天内所有用户使用copilot的概况&#xff1a; 直接把这个图丢给copilot让它去分析&#xff0c;结果如下&#xff1a; 总用户情况 总用户数在各应用中均为 561 人&#xff0c;说明此次统计的样本…

AI学习第一天-什么是AI

AI的发展可以被分为四次浪潮&#xff0c;这包括符号主义、机器学习与神经网络&#xff0c;以及深度学习。在这些发展中&#xff0c;深度学习凭借其在处理非结构化复杂数据、强大的学习能力和可解释性方面的优势备受关注。深度学习技术的应用不仅提升了AI系统的性能&#xff0c;…

计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…

解决本地模拟IP的DHCP冲突问题

解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中&#xff0c;如果本机原有 IP&#xff08;如 192.168.2.7&#xff09;是通过 DHCP 自动获取的&#xff0c;直接添加新 IP&#xff08;如 10.0.11.11&#xff09;可能会导致 DHCP 服…

安全生产月安全知识竞赛主持稿串词

女:尊敬的各位领导、各位来宾 男:各位参赛选手、观众朋友们 合:大家好&#xff5e; 女:安全是天&#xff0c;有了这一份天&#xff0c;我们的员工就会多一份幸福&#xff0c; 我们的企业就会多一丝光彩。 男:安全是地&#xff0c;有了这一片地&#xff0c;我们的员工就多了一…

JDBC学习

背景&#xff1a;主机正在运行mysql服务 在cmd输入 mysql -u root -p 之后&#xff0c;输入密码&#xff08;我的用户名是root&#xff0c;密码是root&#xff09;&#xff0c;成功登录到mysql。 输入&#xff1a;SHOW GLOBAL VARIABLES LIKE port; 检查mysql服务的端口号 …

前端js进阶,ES6语法,包详细

进阶ES6 作用域的概念加深对js理解 let、const申明的变量&#xff0c;在花括号中会生成块作用域&#xff0c;而var就不会生成块作用域 作用域链本质上就是底层的变量查找机制 作用域链查找的规则是:优先查找当前作用域先把的变量&#xff0c;再依次逐级找父级作用域直到全局…

IDEA通过Maven使用JBLJavaToWeb插件创建Web项目

第一步&#xff1a;IDEA下载JBLJavaToWeb插件 File--->Settings--->Plugins--->Marketplace搜索: JBLJavaToWeb 第二步&#xff1a;创建普通Maven工程 第三步&#xff1a; 将普通Maven项目转换为Web项目

在VSCode中接入deepseek

注册就送14元2000万tokens。 https://cloud.siliconflow.cn/i/rnbA6i6U各种大模型 下面介绍我是如如接入vscode的 左边生成一个key&#xff0c;呆会vscode要用&#xff0c;不然401. 打开vscod&#xff0c;电脑能上网。下插件。 下好要配置 点它一下。 要配置&#xff0c;全…

Mac端homebrew安装配置

拷打了一下午o3-mini-high&#xff0c;不如这位博主的超强帖子&#xff0c;10分钟结束战斗 跟随该文章即可&#xff0c;2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次&#xff0c;点赞258次&#xff0c;收藏837次。一直觉得自己写…

安全启动(secure boot)怎么关闭_史上最全的各品牌机和组装机关闭安全启动教程

很多网友发现电脑BIOS设置中都有一个secure boot(安全启动)选项&#xff0c;而且一些预装win10或win11改Win7的教程中也有提到要把安全启动关闭&#xff0c;那么我们该怎么关闭安全启动呢&#xff1f;下面教大家各品牌机和组装机关闭安全启动教程。 secure boot该关还是开&…