最佳調度問題(搜索回溯)


最佳調度問題
【問題描述】
       假設有n個任務由k個可並行工作的機器完成。完成任務i需要的時間為ti。試設計一個算法找出完成這n個任務的最佳調度,使得完成全部任務的時間最早。
【編程任務】
       對任意給定的整數n和k,以及完成任務i需要的時間為ti,i=1~n。編程計算完成這n個任務的最佳調度。
【輸入格式】
      由文件machine.in給出輸入數據。第一行有2 個正整數n和k。第2 行的n個正整數是完成n個任務需要的時間。
【輸出格式】
      將計算出的完成全部任務的最早時間輸出到文件machine.out。
【輸入樣例】
7  3
2  14  4  16  6  5  3
【輸出樣例】
  17
 /*搜索問題我會先想每個小問題面臨的共同條件是什么,每加入一件任務,他加入的條件是什么?他要加入哪個機器?加入的條件是什么?時間怎樣最短?然后我就蒙圈了、、、我智障的想法是search(1,1)把第一個加入第一個機器,然后直到search(7,1)把第七個加入第一個,然后再加一個機器search(1,2)直到search(7,2)后來想想真是愚蠢吶,上網搜了一下、、
才明白...orz,search(int,int)里面的兩個參數一個表示加入的第幾個任務,另一個是現在的時間,所以search()里面是什么很重要,我發現這就比如前面的題目的效率問題,求最高的效率,search()里面也有一個參數代表效率,從0開始;還有着一個題注意剪枝,當這一種情況已經比之前找到的最小值大時這種情況就可以舍棄不用考慮了QWQ*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[30],s[30];
int n,k,minn=0x7ffff;
void search(int,int);
int main() {
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; i++) //輸入每個時間
        scanf("%d",&a[i]);
    search(1,0);//加入第一個時間,現在花費的時間是0;
    cout<<minn;
    return 0;
}
void search(int x,int y) {
    if(y>=minn)return;//剪枝 已經比最小的大了就不用再放了,舍棄這種方法
    if(x>n) { //放完了進行判斷
        if(y<minn)minn=y;
        return;
    }
    for(int i=1; i<=k; i++) {
        if(s[i]+a[x]<=minn) { //剪枝
            s[i]+=a[x];
            search(x+1,max(y,s[i]));
            s[i]-=a[x];//回溯
        }
    }
    return;
}

 


免責聲明!

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



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