1. 程式人生 > 實用技巧 >7-5 最佳排程問題 (30分)

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