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; 
     
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM