最佳调度问题(搜索回溯)
生活随笔
收集整理的這篇文章主要介紹了
最佳调度问题(搜索回溯)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最佳調度問題 【問題描述】 假設有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;
}
?
轉載于:https://www.cnblogs.com/zzyh/p/6612514.html
總結
以上是生活随笔為你收集整理的最佳调度问题(搜索回溯)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程句柄和进程ID的区别和关系
- 下一篇: 利用scons构建project