用兩臺處理機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;
}
輸入已經在代碼中輸入
運行效果: