问答题

阅读下列说明和C代码,回答下列问题。
[说明]
用两台处理机A和B处理n个作业。设A和B处理第i个作业的时间分别为ai和bi。由于各个作业的特点和机器性能的关系,对某些作业,在A上处理时间长,而对某些作业在B上处理时间长。一台处理机在某个时刻只能处理一个作业,而且作业处理是不可中断的,每个作业只能被处理一次。现要找出一个最优调度方案,使得n个作业被这两台处理机处理完毕的时间(所有作业被处理的时间之和)最少。算法步骤如下。
(1)确定候选解上界为R短的单台处理机处理所有作业的完成时间m,

(2)用p(x,y,k)=1表示前k个作业可以在A用时不超过x且在B用时不超过y时间内处理完成,则p(x,y,k)=p(x-ak,y,k-1)‖p(x,y-bk,k-1)(‖表示逻辑或操作)。
(3)得到最短处理时间为min(max(x,y))。
[C代码]
下面是该算法的C语言实现。
(1)常量和变量说明
n:作业数
m:候选解上界
a:数组,长度为n,记录n个作业在A上的处理时间,下标从0开始
b:数组,长度为n,记录n个作业在B上的处理时间,下标从0开始
k:循环变量
p:三维数组,长度为(m+1)*(m+1)*(n+1)
temp:临时变量
max:最短处理时间
(2)C代码
#include<stdio.h>
int n, m;
int a[60], b[60], p[100] [100] [60];
void read() …… /*输入n、 a、 b, 求出m, 代码略*/
void schedule() /*求解过程*/
int x, y, k;
for (x=0;x<=m;x++)
for (y=0;y<m;y++)
______
for (k=1;k<n;k++)
p[x] [y] [k] =0;


for (k=1;k<n;k++)
for (x=0;x<=m;x++)
for (y=0;y<=m;y++)
if (x-a[k-1]>=0)
______;
if (______)
p[x] [y] [k]=(p[x] [y] [k] ‖ p[x] [y-b[k-1]] [k-1]);




void write() /*确定最优解并输出*/
int x, y, temp, max=m;
for (x=0;x<=m;x++)
for (y=0,y<=m;y++)
if (______)
temp______:
if (temp<max) max = temp;



print ("\n%d\n",max) ;

void main()
read() ;
schedule() ;
write() ;

[问题1]
根据以上说明和C代码,填充C代码中的空缺处。

【参考答案】

p[x][y][0]=1
p[x][y][k]=p[x-a[k-1]][y][k-1]
y-b[k-......

(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

问答题
阅读下列函数说明,将应填入 (n) 处的字句写在答卷纸的对应栏内。 【函数1说明】 函数compare(SqList A,SqList B)的功能是:设A=(al,…,am)和B=(b1,…,bn)均为顺序表,“比较”两个顺序表A和B的大小。设A’和B’分别为A和B中除去最大共同前缀后的子表(例如,A=(y,X,X,Z,X,Z),B=(y,x,x,z,y,x,x,2),则两者中最大的共同前缀为(y,x,x,2),在两表中除去最大共同前缀后的子表分别为A’=(X,Z)和B’=(y,x,x,2))。若A’=B’=空表,则 A=B:若A’=空表,而B’≠空表,或者两者均不为空表,且A’的首元小于B,的首元,则A<B;否则A>B。 提示:算法的基本思想为:若相等,则j+1,之后继续比较后继元素:否则即可得山比较结果。显然,j的初值应为0,循环的条件是j不超出其中任何一个表的范围。若在循环内不能得出比较结果,则循环结束时有3种可能出现的情况需要区分。 【函数1】 int compare(SqList A,SqList B) 若A<B,则返回-1;若A=B,则返回o:若A>B,则返回1 j=0; while(j< (1) &&j<B.1ength) if( A.elem[j] < B.elem[j] ) return(-1); else if( A.elem[j] > B.elem[j] ) return(i); else (2) ff (A.length == B.length) return (0); else fi(A.length < B.length ) return(-1); else return(1); compare 函数1的时间复杂度是 (3) 【函数2说明】 函数 exchange_L( SLink &L, int m )的功能是:用尽可能少的辅助空间将单链表中前 m个结点和后 n 个结点的互换。即将单链表(a1,a2,...,am,b1,b2,...,bn) 改变成 (b1,b2,...,bn,a1,a2,…,am)。 【函数2】 void exchange_L( SLink &L, int m ) if( (4) && L->next) 链表不空且 m!=0 p = L->next; k = 1; while( k< m && p ) 查找am所在结点 p = (5) ; ++k; if( (6) &&p->next) n!=0 时才需要修改指针 ha = L->next; 以指针ha记a1 结点的位置 L->next = p->next; 将b1结点链接在头结点之后 p->next = NULL; 设am的后继为空 q: (7) ; 令q 指向b1结点 while(q->next)q= (8) ; 查的bn结点 q->next = (9) ; 将a1 结点链接到bn 结点之后 函数2的时间复杂度是 (10) 。