7.5 深搜-最佳调度问题(枚举排列+回溯+剪枝)

这几天偷了几天懒,今天为大家讲解一篇深搜好题,典型的全排列问题需运用剪枝+回溯来优化运行时间,与上一道都是比较典型的深搜优化问题。

题目描述

假设有n个任务由k个可并行工作的机器完成,完成任务i需要的时间为ti,对任意给定的整数n和k,以及完成任务i需要的时间ti,设计一个算法,求完成这n个任务的最佳调度,使得完成全部任务的时间最早。

输入

第一行有2个正整数n和k,第二行有n个正整数,表示ti

n<7000,c<maxlongin

输出

一个整数,输出最早时间

样例输入

7 3
2 14 4 16 6 5 3

样例输出

17

题解代码:#include<iostream>#include<string>#include<algorithm>using namespace std;int n,k;int a[7001],ans=0xffffff,s[7001]; bool cmp(int x,int y){ return x>y;}void dfs(int x,int y){//x为当前第i个任务,y为用时最大值  if(ans<=y) return ;//剪枝  if(x==n){  if(y<ans){   ans=y;     }  return ; }  for(int i=0;i<k;i++){  if(s[i]+a[x]<ans){ //最优化剪枝:往容器里放的时候不能超过当前已知的最小值   s[i]+=a[x];   dfs(x+1,max(y,s[i]));//搜索下一层,第二个关键字是当前k个容器里的最大值   s[i]-=a[x];  } }} int main(){// freopen("best_arrange.in","r",stdin); scanf("%d%d",&n,&k); for(int i=0;i<n;i++){  scanf("%d",&a[i]); } sort(a,a+n,cmp);//先对大的任务进行排列比较省时 dfs(0,0); printf("%d\n",ans); return 0;}

题解:n件任务对应k台机器来执行,即枚举k台机器来承载n项任务,对应的dfs(x,y)(x为第x台机器,y为k台机器中的最大值);1.当n件任务执行完如果y<ans,则ans=y并返回2.枚举到当前值如果y>=ans,直接返回3.枚举k台机器的时候,如果第i台机器s[i]+a[x]>=ans,直接continue进入下一次循环,为的是防止出现各台机器之间出现执行任务的相同情况,节省运行时间

原文地址:https://www.cnblogs.com/cxs070998/p/11141198.html

时间: 2024-08-15 07:16:17

7.5 深搜-最佳调度问题(枚举排列+回溯+剪枝)的相关文章

hdu 1518 Square 深搜,,,,花样剪枝啊!!!

Square Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9588    Accepted Submission(s): 3127 Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end

7.23 深搜广搜

深搜(DFS)  关键词:回溯 栈实现,(递归本质和栈一样)一直走到底再回溯,时间复杂度高,空间低 #include<iostream> #include<cstring> using namespace std; int R,C; char maps[40][40]; int dp[40][40]; int dir[2][4]={{1,0,0,-1},{0,1,-1,0}}; int ans=1<<30; void DFS(int x,int y,int step){

POJ 2676 挺复杂的一道深搜

这道题之前就做了,一直没写题解,很不错的一道深搜题.这道题没什么剪枝优化,思路就是将空白格子的位置放入一个数组,然后用dfs尝试每个空白格子所放的数字. Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15861   Accepted: 7753   Special Judge Description Sudoku is a very simple task. A square table with 9 ro

HDU 3720 深搜 枚举

DES:从23个队员中选出4—4—2—1共4种11人来组成比赛队伍.给出每个人对每个职位的能力值.给出m组人在一起时会产生的附加效果.问你整场比赛人员的能力和最高是多少. 用深搜暴力枚举每种类型的人选择情况.感觉是这个深搜写的很机智. 在vector中存结构体就会很慢.TLE.直接存序号就AC了.以后还是尽量少用结构体吧. #include<stdio.h> #include<string.h> #include<map> #include<vector>

7.1 深搜-子集和问题 (枚举子集+剪枝)

---恢复内容开始--- 7.1,今日AC题目5到,今天为大家讲解一道普及组的深搜剪枝问题,这道题参解时需要在脑海及对应的手上模拟,切忌眼高手低,切忌三心二意 题目描述 对于一个给定正整数的集合s={x1,x2,x3…xn}和正整数c,编程计算s的第一个子集s1,使得子集s1的和等于c. 输入 第一行有2个正整数n和c 第二行有n个正整数 n<7000,c<maxlongint 输出 一行数据,按输入的顺序输出,若无解则输出"No Solution!" 样例输入 5 10

六月二十日 上午(深搜)

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

hdu1455 Sticks 深搜 强剪枝

Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6035    Accepted Submission(s): 1704 Problem Description George took sticks of the same length and cut them randomly until all parts becam

poj1190 生日蛋糕(深搜+剪枝)

题目链接:poj1190 生日蛋糕 解题思路: 深搜,枚举:每一层可能的高度和半径 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到小试 剪枝: ①已建好的面积已经超过目前求得的最优表面积,或者预见到搭完后面积一定会超过目前最优表面积,则停止搭建(最优性剪枝) ②预见到再往上搭,高度已经无法安排,或者半径无法安排,则停止搭建(可行性剪枝) ③还没搭的那些层的体积,一定会超过还缺的体积,则停止搭建(可行性剪枝) ④还没搭的那些层的

nyoj 488 素数环(深搜)

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样