7-5 最佳调度问题 (30分)

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

输入格式:

输入数据的第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。

输出格式:

将计算出的完成全部任务的最早时间输出到屏幕。

输入样例:

在这里给出一组输入。例如:

7 3
2 14 4 16 6 5 3

  

输出样例:

在这里给出相应的输出。例如:

17

代码:

#include <bits/stdc++.h>
using namespace std;

int n; // n个等待分配的任务(时间)
int k; // k个容器(机器)    
int best=999999; //最佳调度(最短时间),初始化为一个很大的数
int ti[30]; // 完成任务i所需要的时间为 time【i】 , 数组名用 time 会报错 
int total[30]={0}; // 分配完任务后,第i个容器完成任务所需要的时间总和为 total【i】,初始化为 0 
int dep=0; // 深度,tmie【dep】表示第dep个任务需要的时间, 
               // 每次分配完 dep+1 , 当 dep == n 时可以得到一个分配方案, 并得到该方案所需要的时间 

// 计算一种分配方案所需要的时间 
int GetTime()
{
   int temp=0;
   for(int i=0;i<k;i++)
   {
      temp = max(total[i],temp);  //该分配方案所需要的时间 = 最后完成任务的那个容器所需要的时间 
   }    
   return temp; 
}

// 深度遍历 
void search(int dep)  //第dep个任务的分配
{
    if ( dep == n )  // 深度遍历到了叶子节点,得到一个分配方案,更新 best 
    {
        int Total_Time = GetTime();
        best=min(best,Total_Time); 
        return ;
    }
    for(int i=0;i<k;i++)
    {
        total[i]=total[i]+ti[dep]; // 将任务dep分给机器i
        
        // 如果机器i完成任务所需要的时间 > best , 那就没有继续往下搜索的必要了 
        if( total[i]<best )search(dep+1);   // 继续分配第 dep+1 个任务 
        
        total[i]=total[i]-ti[dep]; // 回溯,任务dep不分给机器i
                                    //i++ , 继续讨论 任务dep分配给机器i+1的情况 
     }
     
     return ; 
}



int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>ti[i]; 
    } 

    search(0); // 从 第0个任务的分配开始
    
    cout<<best<<endl;
    
    return 0; 
     
}
原文地址:https://www.cnblogs.com/lvjingyuan/p/14048922.html