网易双核编程,python

来源:互联网 发布:网络翻唱歌手 编辑:程序博客网 时间:2024/06/04 19:44

题目:

一种双核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\jweightvalue0123456789511011344678943300033367793330003336777233000333377717700000007770000000000000

解释一下这个表(不管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[n][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)



                                             
0 0
原创粉丝点击