第13章贪心算法

贪心算法

局部最优求得总体最优

适用于桌上有6张纸币,面额为100 100 50 50 50 10,问怎么能拿走3张纸币,总面额最大?—拿单位价值最高的

  1. 只关注局部最优----关注拿一张的最大值
  2. 拆解-----拿三次最大的纸币

不适用于桌面三件物品,每个物品都有重量和价值,

w v

6 9

5 7

3 3

承重为8,求不超过背包承重情况下最大价值

  1. 只能选一件,能不能得到最大值----选 6 9
  2. 还剩下二,能选第二件吗?不能选

所以不适用,因为不能局部最优求得总体最优

贪心算法的设计就是一次一次用偏序关系证明贪心策略

偏序关系

在数学中,偏序集合是有序理论中,指配备了部分排序关系的集合(集合没有顺序,但加了一个用于排序的关系),将排序,顺序或排列这个元素的直觉概念抽象化。

使用偏序关系的传递性:xRy,yRz–>xRz,局部最优使得全局最优

例题1-国王游戏

排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

输出一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

C[i]=A[j]/B[i] :累乘从0到i-1

微扰:调整i和i+1位置的大臣,观察序列前后的变化:

微调的两个元素A[i]和A[i+1]只会改变他们两本身:所以微调后的C[i]'和C[i+1]'同时小于C[i+!]

A[i]xB[i] >= A[i+1]xB[i+1] :越小越往前,越大越往后

#include <iostream>
#include <algorithm>using namespace std;
#define MAX_N 1000
int a[MAX_N+5],b[MAX_N+5],ind[MAX_N+5]; //使用ind不对原数组排序,对下标数组排序
void acm_1_6_paixu_GuowangYouxi_test(){
//    A[i]xB[i] >= A[i+1]xB[i+1] :越小越往前,越大越往后int n;cin >> n;for(int i=0;i<=n;i++){cin >>a[i]>>b[i]; //左右手ind[i]=i;}sort(ind+1,ind+n+1,[&](int i,int j)->bool{return a[i]*b[i]<a[j]*b[j];});//统计大臣获得的最多金币数量int p=a[0],ans=0;for (int i=1;i<=n;i++){if(p/b[ind[i]]) //ind[i]表示排完序之后大臣的编号ans=p/b[ind[i]];p*=a[ind[i]];}cout << ans<<endl;}
int main(){acm_1_6_paixu_GuowangYouxi_test();return  0;
}
def acm_1_6_paixu_GuowangYouxi_test():n=int(input())a=list(range(n+1))b=list(range(n+1))ind=list(range(n+1))for i in range(n+1):a[i],b[i]=list(map(int,input().split()))ind[i]=iind[1:]=sorted(ind[1:],key=lambda i:a[i]*b[i]) #按照a[i]*b[i]从小到大排序ans=0p=a[0]for i in range(1,n+1):if(p//b[ind[i]]>ans):ans=p//b[ind[i]]p*=a[ind[i]]  #左边所有大臣左手累乘print(int(ans))
acm_1_6_paixu_GuowangYouxi_test()

最大整数

局部最优:a+b > b+a

arr.sort(key=cmp_to_key(cmp2))

from functools import cmp_to_key
def cmp2(a,b):if a + b > b + a: #大于return -1elif a + b < b + a: #小于return 1else:return 0 #相等
def test():n=int(input())arr = input().split()arr.sort(key=cmp_to_key(cmp2))print("".join(arr))
test()
#include <string.h>
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;
bool cmp(const string &a,const string &b){return a+b > b+a;
}
int main(){vector<string> arr;string s;int n;cin >> n;for (int i=0;i<n;i++){cin >> s;arr.push_back(s);}sort(arr.begin(),arr.end(),cmp);for(int i=0;i<n;i++){cout <<arr[i];}cout <<endl;}

删除

每次删除一位,保证删除一位后得到的结果位删除一位最小值

#include <iostream>
using namespace std;
#define MAX_N 500int main(){char s[MAX_N+5];int k;cin >> s >>k;for(int i=0;i<k;i++){ //进行k次删除,每次删除一位int j=0;//留下n-1位的最小值while(s[j+1] !='\0' && s[j] <= s[j+1]){++j;}//12343 //得到第一个逆序位高位4while(s[j]) s[j]=s[j+1],j++; //后面的向前移动//完成一轮删除}for(int i=0,flag=1;s[i];i++){if(s[i]=='0' && flag){//首位0不输出//flag表示有没有输出过数字continue;}cout << s[i];flag=0;}cout <<endl;return  0;
}
#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 Cry, Inc. All Rights Reserved 
#
# @Time    : 2024/4/10 11:47
# @Author  : Cry
# @File    : 删数、.py
# @IDE     : PyCharms=input()
n=int(input())
for i in range(n):for j in range(len(s)+1):if j+1==len(s):s=s[:j]+s[j+1:]breakif s[j]>s[j+1]:s=s[:j]+s[j+1:]break
print(int(s))

HZOJ 503独木舟

每次找最重和最轻的坐在一起

能坐在一起就一起走

不能坐在一起,就只让重的坐一条船

//
// Created by cry on 2024/4/10.
//
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;void acm_1_13_tanxin_DumuZHou_test(){int w,n;cin >>w >> n;vector<int> arr(n);for(int i=0;i<n;i++){cin >> arr[i];}sort(arr.begin(),arr.end());int i=0,j=n-1,cnt=0; // i为最轻的 j为最重的while(i<j){//最轻的和最重的能不能坐一个船if(arr[i]+arr[j]<=w){i++,j--;}elsej--;cnt+=1;}if(i==j) cnt+=1; //还剩一个人cout << cnt<<endl;
}
#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 Cry, Inc. All Rights Reserved 
#
# @Time    : 2024/4/10 12:22
# @Author  : Cry
# @File    : 独木舟.py
# @IDE     : PyCharmw=int(input())
n=int(input())
arr=list(range(n))
for i in range(n):arr[i]=int(input())
arr=sorted(arr)
i=0
j=n-1
cnt=0
while(i<j):if(arr[i]+arr[j]<=w):i+=1j-=1else:j-=1cnt+=1
if(i==j):cnt+=1
print(cnt)

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

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

相关文章

【Linux系统编程】信号

目录 1、信号1.1、什么是信号1.2、进程对信号的处理1.3、信号的生命周期1.4、信号处理流程1.5、信号的发送 2、kill()、raise()函数 发送信号3、alarm函数 闹钟信号4、pause函数 挂起信号、暂停5、singal 函数 捕获信号5.1、为什么返回值是上一次的处理方式5.2、练习 6、sigact…

git使用命令总结

文章目录 Git 复制创建提交步骤Git 全局设置:创建 git 仓库:已有仓库? 遇到问题解决办法&#xff1a;问题一先git pull一下&#xff0c;具体流程为以下几步&#xff1a; 详细步骤 Git 复制 git clone -b RobotModelSetting/develop https://gitlab.123/PROJECT/123.git创建提…

解锁 AI 核心:神经网络与机器学习知名算法全解析

引言​ 在人工智能蓬勃发展的当下&#xff0c;神经网络与机器学习算法作为核心驱动力&#xff0c;广泛应用于各个领域。了解这些知名算法&#xff0c;能让我们更好地把握 AI 技术的精髓。接下来&#xff0c;一同深入探寻。​ 机器学习知名算法​ 线性回归&#xff08;Linear…

基于SpringBoot + Vue 的房屋租赁系统

基于springboot的房屋租赁管理系统-带万字文档 SpringBootVue房屋租赁管理系统 送文档 本项目有前台和后台两部分、多角色模块、不同角色权限不一样 共分三种角色&#xff1a;用户、管理员、房东 管理员&#xff1a;个人中心、房屋类型管理、房屋信息管理、预约看房管理、合…

30天学习Java第六天——Object类

Object类 java.lang.Object时所有类的超类。Java中所有类都实现了这个类中的方法。 toString方法 将Java对象转换成字符串的表示形式。 public String toString() {return getClass().getName() "" Integer.toHexString(hashCode()); }默认实现是&#xff1a;完…

DeepSeek在金融行业应用

引言 随着人工智能技术的快速发展&#xff0c;DeepSeek作为一款国产大模型&#xff0c;凭借其强大的语义理解、逻辑推理和多模态处理能力&#xff0c;在金融行业迅速崭露头角。其低成本、高效率和开源特性使其成为金融机构智能化转型的重要工具。本文旨在分析DeepSeek在金融行业…

【Unity】 HTFramework框架(六十二)Agent编辑器通用智能体(AI Agent)

更新日期&#xff1a;2025年3月14日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 编辑器通用智能体AIAgent类Friday&#xff08;星期五&#xff09;启用智能体设置智能体类型开放智能体权限智能体交互资源优化批处理运行代码联网搜索休闲…

以太坊AI代理与PoS升级点燃3月市场热情,2025年能否再创新高?

币热网深度报道&#xff1a;以太坊AI代理与PoS升级引爆3月热潮&#xff0c;2025年能否再攀历史新高&#xff1f; 原文来源&#xff1a;币热网 - 区块链信息资讯平台 以太坊升级&#xff0c;市场热情高涨 近期&#xff0c;以太坊市场犹如被一股神秘力量点燃&#xff0c;掀起了…

【赵渝强老师】达梦数据库的目录结构

达梦数据库安装成功后&#xff0c;通过使用Linux的tree命令可以非常方便地查看DM 8的目录结构。 tree -L 1 -d /home/dmdba/dmdbms#输出的信息如下&#xff1a; /home/dmdba/dmdbms ├── bin 存放DM数据库的可执行文件&#xff0c;例如disql命令等。 ├── bin2 ├── d…

2025探索短剧行业新可能报告40+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p41043 近年来&#xff0c;短剧以其紧凑的剧情、碎片化的观看体验&#xff0c;迅速吸引了大量用户。百度作为互联网巨头&#xff0c;在短剧领域积极布局。从早期建立行业专属模型冷启动&#xff0c;到如今构建完整的商业生态&#xf…

基于java(springboot+mybatis)汽车信息管理系统设计和实现以及文档

基于java(springbootmybatis)汽车信息管理系统设计和实现以及文档 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各…

线程同步:多线程编程的核心机制

一、线程同步的意义 线程同步的主要目的是避免数据竞争、保证数据一致性、控制线程执行顺序&#xff0c;并提高程序的性能和稳定性。具体意义包括&#xff1a; ​避免数据竞争&#xff1a;防止多个线程同时修改共享资源&#xff0c;导致不可预测的行为。​保证数据一致性&…

Qt QML实现弹球消砖块小游戏

前言 弹球消砖块游戏想必大家都玩过&#xff0c;很简单的小游戏&#xff0c;通过移动挡板反弹下落的小球&#xff0c;然后撞击砖块将其消除。本文使用QML来简单实现这个小游戏。 效果图&#xff1a; 正文 代码目录结构如下&#xff1a; 首先是小球部分&#xff0c;逻辑比较麻…

Android自动化测试工具

细解自动化测试工具 Airtest-CSDN博客 以下是几种常见的Android应用自动化测试工具&#xff1a; Appium&#xff1a;支持多种编程语言&#xff0c;如Java、Python、Ruby、JavaScript等。可以用于Web应用程序和原生应用程序的自动化测试&#xff0c;并支持iOS和Android平台。E…

消息队列实现 Exactly Once,看 Pulsar 是怎样实现的。

大家好 &#xff0c;我是君哥。 在使用消息队列时&#xff0c;我们希望消息能够精准推送&#xff08;Exactly Once&#xff09;&#xff0c;不会丢失、也不会重复。Exactly Once 其实是很难实现的&#xff0c;Pulsar 这款消息中间件使用事务消息实现了 Exactly Once&#xff0…

Audacity的安装和使用

安装 下载地址&#xff1a;官方网站&#xff1a;Audacity 软件开源免费&#xff0c;但部分功能可能需要额外插件。 一.介绍 Audacity 是一款免费、开源的音频编辑软件&#xff0c;适用于Windows、macOS、Linux等操作系统。它支持多轨编辑、录音、音频效果处理、格式转换等功…

C++:类和对象(从底层编译开始)详解[前篇]

目录 一.inline内联的详细介绍 &#xff08;1&#xff09;为什么在调用内联函数时不需要建立栈帧&#xff1a; &#xff08;2&#xff09;为什么inline声明和定义分离到两个文件会产生链接错误&#xff0c;链接是什么&#xff0c;为什么没有函数地址&#xff1a; 二.类&…

【蓝桥】-动态规划-倒水

目录 一、问题描述​ 二、解题思路 三、完整代码 二维dp 使用滚动数组 一、问题描述 二、解题思路 一个变种的01背包问题&#xff1a; 不选该物品&#xff1a;获得固定收益 e 选择方案1&#xff1a;消耗体积 a&#xff0c;获得价值 b 选择方案2&#xff1a;消耗体积 c&…

【软考网工-实践篇】DHCP 动态主机配置协议

一、DHCP简介 DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议。 位置&#xff1a;DHCP常见运行于路由器上&#xff0c;作为DHCP服务器功能&#xff1a;用于自动分配IP地址及其他网络参数给网络中的设备作用&#xff1a;简化网络管理&…

使用 Arduino 和 ThingSpeak 通过互联网进行实时温度和湿度监测

使用 ThingSpeak 和 Arduino 通过 Internet 进行温度和湿度监控 湿度和温度是许多地方(如农场、温室、医疗、工业家庭和办公室)非常常见的测量参数。我们已经介绍了使用 Arduino 进行湿度和温度测量,并在 LCD 上显示数据。 在这个物联网项目中,我们将使用ThingSpeak在互联…