您的位置:首页 > 其它

回溯法解决双核处理问题(某客某易笔试模拟题)

2017-04-08 09:18 288 查看

问题描述:

一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务,n个任务可以按照任意顺序进入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。

输入描述:

输入包括两行:

第一行为整数n(1 <= n <= 50)

第二行为n个整数length[i](1024 <= length[i] <= 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。

输出描述:

输入一个整数,表示最少需要处理的时间

输入例子:

5

3072 3072 7168 3072 1024

输出例子:

9216

实现思路:

该问题总结为四个字就是:负载均衡

要使得最后的处理时间最短,就需要两个核基本同时处于运行状态,尽量少出现一个运行一个空闲状态。

于是,可以通过子集和的方法寻找解,子集和问题解决方法参照回溯法解决子集和问题

目标值为和的中值,如和为17,则target=8.

代码实现:

#include <iostream>
#define nMax 50
using namespace std;

int target = 0;
int n,length[nMax];
int data[nMax];
int c_sum = 0;
int mark = 0; //标记是否有解,0表示无解,1表示有解

void back_search(int i);
int main()
{
int sum = 0;
//input
cin >> n;
for(int i=0;i<n;i++){
cin>>length[i];
data[i]=length[i]/1024;//简化计算
sum += data[i];
}
target = sum/2;
int other = sum-target;
//deal
do{
back_search(0);
target--;
other++;
}while(mark==0);

//output
cout << max(target+1,other-1)*1024<<endl;
return 0;
}
void back_search(int i)
{
if(i>=n){
if(c_sum == target){
mark = 1;
}
return;
}
if(c_sum+data[i]<=target){
c_sum += data[i];
back_search(i+1);
if(mark==1)//一旦找到解,应终止算法
return;
c_sum -= data[i];
}
back_search(i+1);
}


注意细节:

找到解就可以结束了!可大大减少搜索次数!

结果:



Oops,最喜欢这个提示了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息