码迷,mamicode.com
首页 > 其他好文 > 详细

双核处理

时间:2017-09-18 22:38:34      阅读:360      评论:0      收藏:0      [点我收藏+]

标签:最小   解法   mod   处理   cpu   示例   inpu   方法   记录   

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

输入描述:

  输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。

输出描述:

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

 

示例1

输入

5
3072 3072 7168 3072 1024

输出

9216

 

第一种方法(穷举法)

n = int(raw_input())
a = raw_input()
a = a.strip().split()
a = [int(x)/1024 for x in a]
suma = sum(a)
x = {0:1}
for i in a:
    y = {}
    for j in x:
        if j+i not in x:
            y[j+i] = 1
    x.update(y)
res = suma
for i in x:
    res = min(res,max(i,suma-i))
print(res*1024)

代码中x的key记录了,从n个任务选取任意个任务,每种组合所要花费的时间。如果时间一样,只记录一次,这样就列出了所有的可能。最后遍历一遍,选出双核CPU处理完所有任务所需时间最少的组合

 

第二种方法(动态规划)

n = int(raw_input())
a = raw_input()
a = a.strip().split()
a = [int(x)/1024 for x in a]
suma = sum(a)

dst = [[0]*(suma/2+1)]*(n+1)
def pack(i,rest):
    if i >= n:
        return 0
    if dst[i][rest]:
        return dst[i][rest]
    if a[i] <= rest:
        result = max(a[i]+pack(i+1,rest-a[i]),pack(i+1,rest))
    else:
        result = pack(i+1,rest)
    dst[i][rest] = result
    return result
res = pack(0,suma/2)
print(max(res,suma-res)*1024)

借鉴动态规划——01背包问题的解法。

 

 

 
 

双核处理

标签:最小   解法   mod   处理   cpu   示例   inpu   方法   记录   

原文地址:http://www.cnblogs.com/Peyton-Li/p/7545020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!