回溯法解决双核处理问题(某客某易笔试模拟题)
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的倍数。
输出描述:
输入一个整数,表示最少需要处理的时间输入例子:
53072 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,最喜欢这个提示了!
相关文章推荐
- 网易2017实习笔试题-CPU双核调度问题(动态规划解决)
- 利用背包问题解决的双核处理问题
- 网易2017实习笔试题-CPU双核调度问题(动态规划解决)
- 用回溯法解决背包问题
- 解决PEAR::DB类处理多数据库问题
- 为解决ASP.NET MVC(CTP)中URL“页面请求”和“单纯逻辑处理请求”混淆问题,提供一条思路
- 关于TOMCAT中的中文处理问题的解决方法
- 网站无法连接sql sever数据库的一些问题处理,解决自己定义的数据库用户名,无法关联数据库和无法登陆数据库
- 在ashx一般处理程序文件中不能使用session和request的问题解决办法
- 事务处理遇到的问题解决方法
- [HP NX6320]双核笔记本上网死机问题解决方法探索
- 解决PEAR::DB类处理多数据库问题
- 用回溯法解决皇后问题的实现思考
- 回溯法解决N皇后问题
- sql server2005 jdbc解决自动自动增长列统一处理问题纪实
- 在JAVA开发中的中文处理问题及解决办法
- C# 处理XML + XSLT转换中HTML元素的输出问题及解决
- Docbook XML文件前置处理Perl程序,解决回车,空格等等影响FOP排版输出的问题
- Eclipse插件开发中对于Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)
- sqlite3 jdbc、c接口、python接口处理中文时遇到的问题及其解决方法