• 双核处理(动态规划)


      一种双核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().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)

    借鉴动态规划——自顶向下的解法。

     
     
    
    
  • 相关阅读:
    整理前端面试题1
    前端面试题2
    6.显示锁Lock 和 线程通信Condition
    5.创建执行线程的方式之三 :实现Callable 接口
    4.闭锁 CountDownLatch
    3.ConcurrentHashMap 锁分段机制 Copy-On-Write
    2.原子变量 CAS算法
    1.volatile关键字 内存可见性
    13.MyBatis注解式开发
    12.查询缓存
  • 原文地址:https://www.cnblogs.com/Peyton-Li/p/7545020.html
Copyright © 2020-2023  润新知