您的位置:首页 > 编程语言 > Python开发

网易双核编程,python

2017-04-24 19:03 232 查看
题目:

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

输入描述: 

输入包括两行: 

第一行为整数n(1 ≤ n ≤ 50) 

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

输出描述: 

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

输入例子: 



3072 3072 7168 3072 1024

输出例子: 

9216

刚开始做的时候方向偏了,查了之后发现其实是一到背包问题。

关于背包问题,百度解释的很清楚

这边记录一下这道题的结题思路。

1.问题里说明是双核,也就是两个内核同时工作,如果想要时间最少,那么最好把5个需要处理数的“平均”分成两份。

首先根据例子可以知道,数量为n,背包能承受重量为(1+3+3+3+7)/2=9

2. 这样我们可以画一个矩阵。列为10,行为6(为什么是9+1,和5+1下面会解释)

            
i\jweightvalue0123456789
51101134467
89
4330003336779
3330003336777
2330003333777
1770000000777
0000000000000
解释一下这个表(不管weight和value列,这两个列只是为了方便计算)

[i][j]表示的就是背包在j的承重能力下,放i个数据的最大总和。

根据背包问题原理可知

[i][j]= max ([ i-1 ][ j ]  ; [ i-1 ][ j-w[i] ]+v[i]])

原理:(这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-w[i]的背包中”,此时能获得的最大价值就是f [i-1][v-w[i]]再加上通过放入第i件物品获得的价值v[i]。)

3 可以写出代码(完整版):
def shuanghe(n,w):

    sum = 0

    for i in range(len(w)):

        sum = sum +int(w[i])

    W = int(sum/2+1)

    res = [[0 for j in range(W+1)] for i in range(n+1)]

    for j in range(1,W+1):

        res[0][j]=0

    for i in range(1,n+1):

        for j in range(1,W+1):

            res[i][j]=res[i-1][j]

            if j >= int(w[i-1]) and res[i][j] < res[i-1][j - w[i-1]]+w[i-1]:

                res[i][j] = res[i-1][j - w[i-1]]+w[i-1]

    final1 = res
[W]

    final2 = sum - final1

    final = max(final1,final2)

    return final

w = []

n = int(input())

if n<0 or n>50:

    print("1-50")

wstr = raw_input()

w1 = wstr.split(' ')#满足输入需求

w = []

for i in range(n):

    a = int(w1[i])#输入的是字符串形式,我需要Int类型

    w.append(a)

print shuanghe(n,w)


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: