【3-2】最优批处理问题
问题描述:
在一台超级计算机上,编号为1,2, , n 的 n 个作业等待批处理。批处理的任务就是将
这 n 个作业分成若干批,每批包含相邻的若干作业。从时刻 0 开始,分批加工这些作业。在
每批作业开始前,机器需要启动时间 S ,而完成这批作业所需的时间是单独完成批中各个作
业需要时间的总和。单独完成第i 个作业所需的时间是 i
t ,所需的费用是它的完成时刻乘以
一个费用系数 i
f 。同一批作业将在同一时刻完成。例如,如果在时刻T 开始一批作业
x x x k , 1, , ,则这一批作业的完成时刻均为 1
( ) T S t t t x x x k 。最优批处理
问题就是要确定总费用最小的批处理方案。例如,假定有 5 个作业等待批处理,且
1 2 3 4 5 1 2 3 4 5 S t t t t t f f f f f 1,( , , , , ) (1,3, 4, 2,1),( , , , , ) (3, 2,3,3,4)
如果采用批处理方案{1,2},{3},{4,5},则各作业的完成时间分别为(5,5,10,14,14) ,各
作业的费用分别为(15,10,30, 42,56) ,因此,这个批处理方案总费用是 153。
算法设计:
对于给定的待批处理的n 个作业,计算其总费用最小的批处理方案。
数据输入:
由文件 input.txt 提供输入数据。文件的第 1 行是待批处理的作业数n , 第 2 行是启动
时间 S 。接下来每行有 2 个数,分别为单独完成第i 个作业所需的时间是 i
t 和所需的费用系
数 i
f 。
结果输出:
将计算出的最小总费用输出到文件 output.txt 中。
输入文件示例 输出文件示例
input.txt output.txt
5
1
1 3
3 2
4 3
2 3
1 4
153
【题解】
设dp[i]表示i..n这些作业完成花费的最少时间 则dp[i] = min(dp[j]+(f[i]+f[i+1]+..+f[n])(S+t[i]+t[i+1]+...+t[j-1])); 把i,i+1,i+2..j-1作为第一段 N^2的算法.O(N)的还是算了吧。。。【代码】
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10000;
const int M = 1e4;
int n,s;
int t[N+10],f[N+10];
int tt[N+10],ff[N+10];
int dp[N+10];
int main(){
//freopen("C://Users//Administrator//Desktop//测试数据//ch3//prog32//test//batch20.in","r",stdin);
cin >> n;
cin >> s;
for (int i = 1;i <= n;i++) cin >> t[i] >> f[i];
for (int i = n;i >= 1;i--){
tt[i] = tt[i+1] + t[i];
ff[i] = ff[i+1] + f[i];
}
dp[n+1] = 0;
for (int i = n;i >= 1;i--){
dp[i] = -1;
for (int j = i+1;j <= n+1;j++){
int temp = dp[j] + ff[i]*(s+tt[i]-tt[j]);
if (dp[i]==-1) dp[i] = temp;
else dp[i] = min(dp[i],temp);
}
}
printf("%d\n",dp[1]);
return 0;
}