题目描述
用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai>=bi,而对于某些j,j不等于i,有aj<bj。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这2台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。研究一个实例:(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。
输入
第一行是一个正整数n,表示要处理n个作业。在接下来的两行中,每行有n个正整数,分别表示处理机A和B处理第i个作业需要的处理时间。
输出
将计算出的最短处理时间输出。
样例输入
6
2 5 7 10 5 2
3 8 4 11 3 4
样例输出
15
解题思路:
用最短时间,并行运行,上一个运行,下一个另一台在上一个运行时候,可以运行一段时间,比如,2和3相比,2的用时短,但是5和8相比5短,这时候不能并行,但是在5运行时候,下一个是4,也就是可以运行5 的同时运行4,这样可以同时运行了。依次类推。
#include <stdio.h>
int main()
{
int n, i, k;
int sumA = 0;
int result = 1000000000;
scanf("%d",&n);
int a[n],b[n];
for( i = 0; i < n; i++)
{
scanf("%d", &a[i]);
sumA = sumA+a[i];
}
int t[sumA+1];
for( i = 0; i < n; i++)
t[i] = 0;
for( i = 0; i < n; i++)
{
scanf("%d", &b[i]);
}
for( k = 0; k < n; k++)
{
for( i = sumA; i >= 0; i--)
{
if(i >= a[k] )
t[i] = t[i]+b[k] < t[i-a[k]]?t[i]+b[k]:t[i-a[k]];
else
t[i] = t[i]+b[k];
}
}
for( i = 0; i<= sumA; i++)
{
k = i>t[i]?i:t[i];
if(result>k)
result = k;
}
printf("%d\n", result);
return 0;
}