#include<stdio.h> #include <iostream> #include <algorithm> using namespace std; int n , m ,best=1000000; int len[99]; int t[99]={29,7,20,19,19,22,8}; int comp(){ int x= 0; for(int i=0; i<m ; i++) if(len[i]>x) x=len[i]; return x ; } void search(int dep,int *len,int *t){ if(dep==n) { int x=comp(); if(x<best) best=x; return; } for(int i=0; i<m ; i++) { len[i]+=t[dep]; if(len[i]<best) search(dep+1,len,t); len[i]-=t[dep]; } } int main(){ int i; cin>>n>>m ; for (i=0; i<m ; i++) len[i]=0; search(0,len,t); cout<<"处理所有作业所需最短时间:"<<best<<endl; return 0; }这段代码中n和m各表示什么意思
时间: 2024-03-14 08:49:53 浏览: 22
在这段代码中,n和m分别表示任务数和机器数。其中,n表示要分配的任务数,m表示可用的机器数。在main()函数中,通过cin输入n和m的值。在search()函数中,n用于判断是否所有任务都已经被分配完毕,当dep==n时,表示所有任务都已经被分配完毕,搜索结束。m用于循环遍历所有机器,将当前任务分配给空闲的机器。在comp()函数中,m用于遍历所有机器,计算它们的加工时间。
相关问题
#include<stdio.h> #include <iostream> #include <algorithm> using namespace std; int n , m ,best=1000000; int len[99]; int t[99]={29,7,20,19,19,22,8}; int comp(){ int x= 0; for(int i=0; i<m ; i++) if(len[i]>x) x=len[i]; return x; } void search(int dep,int *len,int *t){ if(dep==n) { int x=comp(); if(x<best) best=x; return; } for(int i=0; i<m ; i++) { len[i]+=t[dep]; if(len[i]<best) search(dep+1,len,t); len[i]-=t[dep]; } } int main(){ int i; cin>>n>>m ; for (i=0; i<m ; i++) len[i]=0; search(0,len,t); cout<<"处理所有作业所需最短时间:"<<best<<endl; return 0; }
这段代码是一个经典的“作业调度”问题的解法,使用了回溯算法。具体来说,给出了n个作业,需要分配给m个处理器进行处理,每个作业有一个处理时间,要求所有作业都能被处理完,且完成的时间尽可能短。
代码中使用了一个len数组来记录每个处理器完成作业的时间,t数组记录了每个作业的处理时间。comp函数用来计算完成所有作业的最短时间,search函数是回溯函数,用来对所有可能的作业分配方案进行搜索。具体来说,对于每个作业,遍历所有处理器,将其分配到一个处理器上,然后递归调用search函数继续处理下一个作业。如果当前分配方案的完成时间比之前的最短时间还要短,则更新最短时间。最终输出的就是所有作业完成的最短时间。
需要注意的是,这段代码在处理数据规模较小时可以得到正确的结果,但在数据规模较大时效率会非常低下。因此,如果需要处理大规模数据,需要使用更高效的算法,比如任务调度中的贪心算法或动态规划算法。
逐句讲解以下代码#include<stdio.h> #include <iostream> #include <algorithm> using namespace std; int n , m ,best=1000000; int len[99]; int t[99]={29,7,20,19,19,22,8}; int comp(){ int x= 0; for(int i=0; i<m ; i++) if(len[i]>x) x=len[i]; return x ; } void search(int dep,int *len,int *t){ if(dep==n) { int x=comp(); if(x<best) best=x; return; } for(int i=0; i<m ; i++) { len[i]+=t[dep]; if(len[i]<best) search(dep+1,len,t); len[i]-=t[dep]; } } int main(){ int i; cin>>n>>m ; for (i=0; i<m ; i++) len[i]=0; search(0,len,t); cout<<"处理所有作业所需最短时间:"<<best<<endl; return 0; }
1. `#include<stdio.h>`:引入标准输入输出库头文件。
2. `#include <iostream>`:引入C++标准输入输出流库头文件。
3. `#include <algorithm>`:引入C++算法库头文件。
4. `using namespace std;`:使用标准命名空间。
5. `int n, m, best = 1000000;`:定义整型变量 n,m 和 best,初始值为 1000000。
6. `int len[99];`:定义长度为 99 的整型数组 len。
7. `int t[99] = {29, 7, 20, 19, 19, 22, 8};`:定义长度为 99 的整型数组 t,并给数组赋初值。
8. `int comp()`:定义了一个名为 comp 的函数,返回值为整型。
9. `int x = 0;`:定义整型变量 x,初始值为 0。
10. `for(int i=0; i<m ; i++)`:循环语句,变量 i 的初始值为 0,每次循环后 i 自增 1,循环条件为 i 小于 m。
11. `if(len[i]>x)`:判断语句,如果 len[i] 大于 x,则执行下面的语句。
12. `x = len[i];`:将 len[i] 的值赋给 x。
13. `return x;`:返回变量 x 的值。
14. `void search(int dep, int *len, int *t)`:定义了一个名为 search 的 void 函数,接收三个参数:dep,len 和 t。
15. `if(dep==n)`:判断语句,如果 dep 等于 n,则执行下面的语句。
16. `int x = comp();`:定义整型变量 x,将 comp 函数的返回值赋给它。
17. `if(x<best)`:判断语句,如果 x 小于 best,则执行下面的语句。
18. `best = x;`:将 x 的值赋给 best。
19. `return;`:结束函数的执行。
20. `for(int i=0; i<m ; i++)`:循环语句,变量 i 的初始值为 0,每次循环后 i 自增 1,循环条件为 i 小于 m。
21. `len[i] += t[dep];`:将 len[i] 和 t[dep] 相加,将结果赋给 len[i]。
22. `if(len[i] < best)`:判断语句,如果 len[i] 小于 best,则执行下面的语句。
23. `search(dep+1, len, t);`:递归调用 search 函数,将 dep+1、len 和 t 作为参数传递给它。
24. `len[i] -= t[dep];`:将 len[i] 减去 t[dep],将结果赋给 len[i]。
25. `int main()`:定义了一个名为 main 的函数,返回值为整型。
26. `int i;`:定义整型变量 i。
27. `cin >> n >> m;`:从标准输入流中读取两个整型数值,分别赋给 n 和 m。
28. `for(i=0; i<m ; i++) len[i]=0;`:循环语句,变量 i 的初始值为 0,每次循环后 i 自增 1,循环条件为 i 小于 m,将 len 数组中的每个元素都赋值为 0。
29. `search(0, len, t);`:调用 search 函数,将 0、len 和 t 作为参数传递给它。
30. `cout << "处理所有作业所需最短时间:" << best << endl;`:将字符串和变量 best 打印到标准输出流中,在结尾处加上换行符。
31. `return 0;`:结束程序的执行,返回 0。
阅读全文