题目描述
两台电脑的性能相同,现在小明手里有N个等待运行的程序,每个程序运行所需的时间分别为n1,n2,n3,n4……,一台电脑同一时刻只能运行一个程序,一个程序只需要运行一次。两台电脑同时开始运行,请问小明该如何分配程序在这两台电脑上运行,使得最后结束运行的电脑的运行时间最短。
输入
输入不超过30组数据,每组数据第一行为N,代表有N个等待运行的程序,第二行为N个数字,代表每个程序的运行时间,1 <= N <= 1000 ,每个程序的运行时间均为正整数, 所有程序的运行时间之和不超过5000。
输出
输出最后结束运行的电脑的运行时间
示例
输入:2
1 1
2
1 2
3
1 2 3
输出:1
2
3
思路
转变角度变为背包问题。设总时间的一般为均时,不管什么结果必定一个大于等于均值(长机),一个小于等于均值(短机) 。
所求结果即为短机最长时的长机时长,求出不大于均时的最长短机即可。
实现
#include <iostream>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define MAXPRO 1000
#define MAXTOTAL 5000
int ar[MAXPRO];
int bagc[MAXPRO][MAXTOTAL/2+1];
//bool cmp(int time1,int time2){
// return (time1>time2);
//}
int main(int argc, char** argv) {
int len;
int time;
int timeA;
int timeB;
int res;
int total,average;
int temp1;
int temp2;
while(scanf("%d",&len)!=EOF){
total = 0;
for(int i=0;i<len;i++){
scanf("%d",&time);
ar[i] = time;
total += time;
}
average = total>>1;
sort(ar,ar+len);
for(int j=ar[0];j<=average;j++){
bagc[0][j] = ar[0];
}
for(int i=1;i<len;i++){
time = ar[i];
for(int j=1;j<time;j++){
bagc[i][j] = bagc[i-1][j];
}
for(int j=time;j<=average;j++){
temp1 = bagc[i-1][j];
temp2 = time + bagc[i-1][j-time];
if(temp1<temp2) bagc[i][j] = temp2;
else bagc[i][j] = temp1;
}
}
res = total-bagc[len-1][average];
printf("%d\n",res);
}
return 0;
}