算法:(選做)獨立任務最優調度問題

用兩臺處理機A和B處理n個作業。設第i個作業交給A處理需要時間ai,交給B處理需要時間bi。由於各作業的特點和機器的性能關係,ai和bi之間沒有明確的大小關係。既不能將一個作業分開由2臺機器處理,也沒有一臺機器能同時處理2個作業。設計一個動態規劃算法,使得這兩臺機器處理完這n個作業的時間最短。
測試用例:
6(任務數目)
2 5 7 10 5 2(機器A處理這些任務的時間)
3 8 4 11 3 4(機器B處理這些任務的時間)
輸出:15
思路:
完成k個作業且機器A花費時間爲i時間條件下機器B所花費時間的最小值
f[i][k] = min(f[i][k-1]+b[k],f[i-a[k]][k-1])
如果i<a[k],則一定爲機器B處理
f[i][k]=f[i][k-1]+b[k];
由圖來說明,最優調度
在這裏插入圖片描述

#include<bits/stdc++.h>
using namespace std;
const int n=6;
int a[n+1]= {0,2,5,7,10,5,2};
int b[n+1]= {0,3,8,4,11,3,4};
int mint=65535;
int x=0;
int f[2000][n+1]= {0};

int main()
{
	for(int k=1; k<=n; k++) //代表作業
	{
		x+=a[k];       //假設都在A上運行,得出時間和x(數組打底)

		for(int i=0; i<=x; i++)
		{
			if(i<a[k])
			{
				f[i][k]=f[i][k-1]+b[k];
			}
			else
			{
				f[i][k]=min(f[i][k-1]+b[k],f[i-a[k]][k-1]);
			}
		}
	}
	for(int i=0; i<=x; i++)        //遍歷f數組,f[i][n]的值是n個作
	{
		int t=(f[i][n]>i?f[i][n]:i);//業在B上運行時間,i意思是n個作業在A上運行時間
		if(mint>t)
			mint=t;
	}

	printf("%d\n",mint);
	return 0;
}

輸入已經在代碼中輸入
運行效果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章