深搜 最佳调度问题 C++

算法:最佳调度问题(回溯法-解法) 最佳调度问题(回溯) 【问题描述】 假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。 【编程任务】 对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。 【输入样例】 7 3 2 14 4 16 6 5 3 【输出样例】 17 阅读详情

吉林大学大二学生 东北师范大学附属中学OJ jinxi20111 2019.05.07

题目

【问题描述】
假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
【编程任务】
对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。
【输入格式】
第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。
【输出格式】
将计算出的完成全部任务的最早时间输出。
【输入样例】
7 3
2 14 4 16 6 5 3
【输出样例】
17
【数据范围】
n<=20,k<=8

分析过程

第一眼看过去的时候,个人觉得是一道很EASY的深搜题

但是在逐渐分析的过程中,很容易发现,这道题深搜方式很奇怪


第一种方案 时间超限 原理可行

首先,我们把工作机器当做容器,就有了K个容器

N个任务填入K个容器中,如果生成1~k数列,很容易得出,需要遍历的数列数量为 KN (N个任务所以指数为N)

瞄一眼数据范围,8的20次方,也就是2的60次方,OK,炸了

这个时候,职业的素养告诉我,这道题可能是贪心


第二种方案 贪心

贪心的规则应该比较容易想到

我们分为两种

  1. 按剩余空间贪心

  2. 按空间最密集贪心

第一种,我们将已有的任务排一下序,从大到小,把最大的放入第一个容器中,后面的任务,都放入当前任务最少的容器中。

这种方式,很像我们在学校里干活,每个人都做自己的工作,如果你做完了,那么就再从老师那里领一个任务。

看起来很科学,做完了,答案不对

我通过暴力验证了它的错误,但是一直没有一个很好的反例

于是我去北苑一公寓三楼西北角的洗手间的第三个坑蹲了一会(笑

想出来了

任务:5 5 5 3 3 3 3 3
容器数量为2

很容易知道,第一个容器里放3个5,第二个容器里放5个3,结果为15

但是按照这种贪心的算法,算出来的结果应该是5+5+3+3=16

所以从原理上,这种做法就有错误

不死心的我想出了第二种贪心策略

第二种,按空间最密集贪心

这种方式像是你妈给你收拾行李箱,妈妈总是会从箱子里摆好大件,然后塞进去小件。在里面还有空间,但是小件塞不进去的时候,妈妈会把大件拿出来重新规划位置。(看起来是贪心,实际上已经有了回溯的想法了)

这种方法,我没有验证过,我认为应该是可行的

但是规划方式,已经和DFS并无什么区别了。毕竟你让你的程序找到刚刚好放入容器的组合,除非你的程序里有个人工智能(笑


重头戏 第三种方案 深搜+剪枝

既然深搜会炸,那就剪枝呗QwQ

首先,我必须承认,这道题的剪枝很简单但也很难

找不到的时候我使用了很多方案,在下面的程序中有很多残留的痕迹

比如排序我就没有删除

剪枝有两个部分

第一部分问题很简单,但解决有点困难

1/ 2,3 / 4,5 / 6,7
和
2,3 / 1 / 6,7 / 4,5

这两种方式是完全一致的,但是深搜当中会出现很多次,次数为排列数(手写会,博客里不会打)

解决方案

将第一个任务锁定在第一个容器中,后面的每一个任务,都只能在已使用的容器中,或者下一个新容器中。

这种解决方式可以说非常巧妙(自夸23333)

这样,就解决了第一位乱动的问题,也确保占用新容器的时候,不会因为有多个新容器时增大分支开销。我可真是太智慧了

第二部分 非最优解剪枝

最开始,我用我之前失败的贪心算法,计算了一个较优解,然后向下搜

结果嘛
在这里插入图片描述
233333

么得办法,就只能又去北苑一公寓三楼西北角的洗手间的第三个坑蹲了一会

很开心的是,我又想出来了
在dfs中,之前是这样的

		num[i]+=a[deep];
		b[deep]=i;
		dfs(deep+1);
		num[i]-=a[deep];

蹲完坑之后,我把它改成了这样

if (num[i]+a[deep]<=ans)
	{
		num[i]+=a[deep];
		b[deep]=i;
		dfs(deep+1);
		num[i]-=a[deep];
	}

效果十分显著,运行时间一下就压下来了

这里的ANS,我也没有计算,先放入一个最大值,是所有任务都给1来做(莫名想到自己),这就是ANS的最大值,后面通过计算我们可以不停地得到最大值的最小值!
最大值的最小值!
最大值的最小值!
最大值的最小值!
不明白慢慢想,反正只要在运算过程中,有一个容器中,任务量超过了当前的ans,那么这一定不是最优解,可以剪枝。由于ans不停更新变小,所以剪枝能力也慢慢变强。,最后得出最优解后,后面几乎就不会再有了。

下面就是我精妙而简洁的代码了

//吉林大学大二学生 东北师范大学附属中学OJ jinxi20111 2019.05.07

代码展示

//MythCoffee 最佳调度问题
#include<iostream>
using namespace std;
int n,k;
int a[1000],b[1000];
int num[100];
int h,ans,maxnum,tail;
void dfs(int deep)
{
	if (deep>n)
	{
		maxnum=num[1];
		for(int i=2;i<=k;i++)
		{
			if (maxnum<num[i]) maxnum=num[i];
		}
		if (maxnum<ans) 
		{
			ans=maxnum;
		}
	}
	else
	{
		for(int i=1;i<=tail-1;i++)
		{
			if (num[i]+a[deep]<=ans)
			{
				num[i]+=a[deep];
				b[deep]=i;
				dfs(deep+1);
				num[i]-=a[deep];
			}
		}
		if (tail<k+1)
		{
			num[tail]+=a[deep];
			b[deep]=tail;
			tail++;
			dfs(deep+1);
			tail--;
			num[tail]-=a[deep];
		}
	}
}
int main()
{
	int i,j,x;
	cin>>n>>k;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(i=1;i<=n-1;i++)
		for(j=i+1;j<=n;j++)
		{
			if (a[i]<a[j])
			{
				x=a[i];
				a[i]=a[j];
				a[j]=x;
			}
		}
	for(i=1;i<=k;i++)
	{
		num[i]=0;
	}
	ans=0;
	for(i=1;i<=n;i++)
	{
		ans+=a[i];
	}
	num[1]+=a[1];
	tail=2;
	dfs(2);
	cout<<ans;
	return 0;
	
}
最佳调度问题6_8 最佳调度问题6_8 分支限界 广度优先 剪枝函数 阅读详情

相关推荐

批处理作业调度【回溯算法】

批处理作业调度【回溯算法】

m0_46308522的博客 1万+

最佳调度问题(c++题解)

假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这 n个任务的最佳调度,使得完成全部任务的时间最早。对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。第2行的n个正整数是完成n个任务需要的时间。(所有ai的总和不超过int)样例提示:2、4、6、5组合,14、3组合,16单独。第1行有2 个正整数n和k。将计算出的完成全部任务的最早时间输出。

hb_zhyu的博客 1605

最佳调度问题,假设有n个任务由k个可并行工作的机器完成

最佳调度问题,假设有n个任务由k个可并行工作的机器完成

最佳调度问题,自然是拆分(C++)

最佳调度问题,自然是拆分(C++)

m0_59850318的博客 1511

最佳调度问题的C++代码

【问题描述】:假设有n个任务由k个可并行工作的机器完成。完成任务i需要时间为Ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。 Input : n k Ti Output: 完成任务的最少时间 Sample input Sample output 7 3 17 2 14 4 16 6 5 3

CST STUDIO SUITE 2023安装

破解工具的Crack文件夹内有一个名为「CST Studio Suite 2022」的文件夹,这也是于CST的安装目录同名的文件夹,直接把它拷贝到CST Studio Suite 2022的同级路径下即可,比如你的CST安装路径为:D:\Program Files\CST Studio Suite 2022,则将Crack目录内的「CST Studio Suite 2022」文件夹复制到 D:\Program Files\ 这个级别的路径下即可。软件百度网盘链接放在文章末尾啦!先不着急启动CST或者激活。

m0_49516223的博客 4124

算法实现题5-15最佳调度问题

问题描述:假设有 n 个任务由 k 个可并行工作的机器来完成,完成任务 i 需要的时间为ti。试设计一个算法,找出完成这 n 个任务的最佳调度,使得完成全部任务的时间最早。 算法设计:对任意给定的整数 n 和 k,以及完成任务 i 需要的时间为ti(i=1~n)。计算完成这 n 个任务的最佳调度。 数据输入:第一行有 2 个正整数 n 和 k。第 2 行的 n 个正整数是完 成 n 个任务需要的时间。 输入样例: 7 3 2 14 4 16 6 5 3 结果输出:输出完成全部任务的最早时间 ..

YKYBTao的博客 4794

ReportStudio入门教程(四十一) - 固定报表列宽

我们继续上一篇博客,让他看起来

什么是江湖? 3518

最佳调度(回溯法)

最佳调度问题 【问题描述】 假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。 【编程任务】 对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。 【输入样例】 7 3 2 14 4 16 6 5 3 【输出样例】 17 首先列个七乘三的二维数...

Amazing138的博客 3433

Ubuntu20.04下 嵌入式 Qt 开发环境的搭建(适用于Tiny6410)

Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建 目录导航Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建前言1.安装前的准备工作2.安装交叉编译器 前言 这篇文章,主要是基于 Ubuntu19.10版本而写,写此文的初衷,是为了自己使用,因为最近正在以Tiny6410板子做实训,所以也是初学者一枚,只能保证我遇上的问题统统能够解决掉,至于一些没遇上的,欢迎各位看客给我留言,大家一起讨论,一起解决。 注:本文会持续更新 1.安装前的准备工作 环境要求 Linux系统:U

繁臻的小窝 4895

Agent本地部署教程详细步骤

在开始之前,你需要明确你要部署的Agent是什么。如果你需要部署其他Agent,请参考其官方文档调整步骤。

weixin_39673931的博客 2502

最佳调度问题 回溯法

问题描述 假设有n个任务由k个可并行工作的机器来完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。 输入 7 3 2 14 4 16 6 5 3 输出 17 思路: 使用回溯法的算法框架,回溯法我认为就是深度优先搜索+选择+剪枝的一个过程。 待会注意看这里,mt[] 数组表示每个机器需要执行的时间,初始也就是0 mt[i]+=arr...

阳光大男孩!!!的博客 2855

模型算力需求估算

(Billion Parameters,简称B)和训练/推理的计算任务复杂度,结合硬件计算能力(例如每秒浮点运算次数,FLOPS)来估算。以下是详细的方法和公式说明,以及实际的计算示例。算力需求的估算依赖于参数量、模型架构及硬件性能,结合训练/推理场景的特定要求来计算。通过上述公式和示例,我们可以定量分析不同任务的算力需求,并合理配置硬件资源以优化运行效率。结论:推理任务相对较轻,单台H100可以在30秒内完成此任务。推理算力需求一般远低于训练,因为只需要执行前向传播。,可以将训练时间缩短到约。

形上得其象,形下合于数;阴阳自济,玄理自明。 8955

页面调度算法 FIFO,LRU,OPT,及C++代码

页面调度算法 FIFO,LRU,OPT介绍了三种页面调度算法,给出了C++代码1.FIFO先来先去算法这个非常好理解,给出分析图 可以看出,缺页次数为8次,缺页中断率为8/12=66.7%,依次置换的页面为:1,2,5,3,4C++代码在最后给出2.LRULRU,Least Recently Used 近期最少使用算法,先给出分析图 这个也不难理解,我们只需要从之前的一个页面开始往左寻找就可

wf824284257的博客 1万+

STM32F429移植LVGL9.3.0:从源码配置到双缓冲优化实战

本文详细介绍了如何在STM32F429平台上移植LVGL 9.3.0图形库,涵盖从源码准备、工程配置、显示驱动适配到双缓冲优化等关键步骤。重点解析了利用STM32F429的硬件特性实现高效内存管理和流畅显示性能的实战技巧,为嵌入式GUI开发提供完整解决方案。

q6r7s8t9的博客 1135

被滑块虐了3个月!我终于写出了零失败的Python滑块验证码通杀方案(AI识别+真人轨迹)

缺口识别的偏移量一定要算对:滑块的初始位置一般在图片左侧,宽度约50像素,一定要减去这个初始宽度,不然会滑多了;绝对不要用Selenium的drag_and_drop方法:这个方法是匀速滑动,直接被风控秒识别,必须自己分步控制鼠标移动;滑动前后必须加停顿:真人按住滑块会停0.1-0.3秒再开始滑,松开之前也会停0.05-0.1秒,不要按下去立刻就滑,滑完立刻就松;不要每次都滑的完美无缺:可以设置10%的概率故意滑错一次,然后刷新验证码重新滑,更像真人;无头模式通过率极低。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 501

《算法导论》实验三:最佳调度问题的回溯算法

设有n个任务由k个可并行工作的机器来完成,完成任务i需要时间为 。试设计一个算法找出完成这n个任务的最佳调度,使完成全部任务的时间最早。(要求给出调度方案)

allin_allin的恋爱小屋 1万+

PCL 均匀采样【2026最新版】

根据输入点云数据创建一个微小的三维立方体集合,然后计算每个三维立方体的重心;由于该重心点不一定是原始点云中的点,直接用该点来表示立方体内所有的点会丢失原始点云的细小特征;所以使用k最近邻搜索寻找距离重心点最近的原始点来代替重心点。

点云侠的博客 41万+

最佳调度问题

假设有n(n<=20)个任务由k(k<=20)个可并行工作的机器完成。完成任务i需要的时间为ti。 试设计一个算法,对任意给定的整数n和k,以及完成任务i 需要的时间为ti ,i=1~n。计算完成这n个任务的最佳调度,使得完成全部任务的时间最早。 输入格式: 输入数据的第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。 输出格式: 将计算出的完成全部任务的最早时间输出到屏幕。 #include #include using namespace std; int a

tnbzndm的博客 216

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

PTA最佳调度问题:如何用回溯法优化任务分配(附C++代码详解)

本文深入解析了PTA最佳调度问题,即如何将多个任务分配到多台机器上以最小化完工时间。通过回溯算法框架,结合最优性剪枝和顺序性剪枝等优化策略,显著提升搜索效率。文章提供了详细的C++代码实现与逐行解析,帮助开发者掌握解决此类NP-hard问题的核心思路与实战技巧。

eee77的博客 717

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

回溯法实战:如何用C++解决最佳调度问题(附优化代码)

本文详细介绍了如何使用C++实现回溯法解决最佳调度问题,包括基础解法、关键优化技巧(如剪枝策略、启发式初始化和并行化探索)以及数据结构优化。通过性能对比和实测分析,展示了优化策略带来的显著效率提升,适合希望在实际问题中应用回溯法的进阶开发者。

weixin_29275257的博客 161

最佳调度问题使用状态压缩dp求解

#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int main() { int n, k; cin >> n >> k; int tasks[n]; for(int i = 0; i < n; i ++) cin >> tasks[i]; int dp[1 << n][k.

cyz3209的博客 263

回溯法实现最佳调度问题(Java)

回溯法实现最佳调度问题(Java) 回溯法实现最佳调度问题的网上解答有很多,但基本上都是C或C++实现的,而且基本上只是粘了个代码而没有详细解释,因此我写了这篇文章,如有不对的地方,欢迎指正。 问题描述 最佳调度问题的回溯算法实现:有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为Ti。找出完成这n个任务的最佳调度,使得完成全部任务的时间最少。用文件导入每个任务所需要的时间Ti

linovce的博客 4465

C++硬实时调度:原理、实践与最佳方案

本文深入探讨C++在硬实时系统开发中的关键技术应用。首先从实时系统的基本概念入手,重点分析了硬实时系统的四大特性:确定性、优先级驱动调度、资源有限性和可靠性。随后详细介绍了实时操作系统(RTOS)的核心机制,包括实时调度算法(如RM、EDF)和优先级反转问题解决方案(PIP、PCP)。在C++实现层面,文章提出了三项关键技术:利用C++11原子操作和线程同步原语、避免动态内存分配采用静态对象池方案、以及优化中断处理机制以最小化延迟。这些技术为开发高可靠性硬实时系统提供了重要指导。

qq2745567641的博客 1313
下一篇: 深搜 图的M着色问题
jinxi20111
博客等级 码龄8年 110粉丝 12原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值