批处理作业调度问题
给定n个作业的集合J={J1,J2,…,Jn}。每一个作业有两项任务分别在两台机器上完成。每个作业必须先由机器1处理,再由机器2处理。作业Ji需要机器j的处理时间为tji,i=1,2,…n,j=1,2。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。则所有作业在机器2上完成处理的时间和f=F21+F22+…+F2n称为该作业调度的完成时间和。
批处理作业调度问题要求,对于给定的n个作业,制定最佳的作业调度方案,使其完成时间和最小。
样例输入
3
2 1
3 1
2 3
样例输出
18
1 3 2
自己在纸上画画示例的图,并结合着排列数的回溯很容易写出代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int x[100][2]; 5 int x1[100]; 6 int x2[100]; 7 int sum1=0,sum2=0; 8 int best=100000; 9 int num; 10 void swap(int &a,int &b){ 11 int temp; 12 temp=a; 13 a=b; 14 b=temp; 15 } 16 void backtrace(int level) 17 { 18 if(level>n){ 19 20 sum1=0; 21 sum2=0; 22 num=0; 23 for(int i=1;i<=n;i++){ 24 sum1+=x[x1[i]][0]; 25 int temp=max(sum1,sum2); 26 sum2=(temp+x[x1[i]][1]); 27 num+=sum2; 28 } 29 if(num<best){ 30 best=num; 31 for(int i=1;i<=n;i++){ 32 x2[i]=x1[i]; 33 } 34 } 35 }else{ 36 for(int i=level;i<=n;i++){ 37 swap(x1[level],x1[i]); 38 backtrace(level+1); 39 swap(x1[level],x1[i]); 40 } 41 } 42 } 43 int main() 44 { 45 cin >> n; 46 for(int i=1;i<=n;i++){ 47 for(int j=0;j<=1;j++){ 48 cin >> x[i][j]; 49 } 50 } 51 for(int i=1;i<=n;i++){ 52 x1[i]=i; 53 } 54 backtrace(1); 55 cout << best << endl; 56 for(int i=1;i<=n;i++){ 57 cout << x2[i]<< " "; 58 } 59 return 0; 60 }
作者:你的雷哥
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!