Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 复制书籍UVa在线判断动态编程解决方案_Algorithm_Dynamic Programming - Fatal编程技术网

Algorithm 复制书籍UVa在线判断动态编程解决方案

Algorithm 复制书籍UVa在线判断动态编程解决方案,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我可以使用二进制搜索方法来解决这个问题,因为它很容易实现。但是我刚刚开始解决动态编程问题,我想知道这个问题的动态编程解决方案 在书籍印刷术发明之前,很难制造出一种新的印刷品 一本书的副本。所有的内容都必须由so手写 称为抄写员。抄写员得到了一本书,几天后 几个月后,他完成了它的副本。一位最著名的抄写员住在伦敦 15世纪,他的名字是Xaverius Endricus Remius Ontius Xendrianus(施乐)。不管怎么说,这工作很烦人,也很无聊。及 加快速度的唯一办法是雇佣更多的抄写

我可以使用二进制搜索方法来解决这个问题,因为它很容易实现。但是我刚刚开始解决动态编程问题,我想知道这个问题的动态编程解决方案

在书籍印刷术发明之前,很难制造出一种新的印刷品 一本书的副本。所有的内容都必须由so手写 称为抄写员。抄写员得到了一本书,几天后 几个月后,他完成了它的副本。一位最著名的抄写员住在伦敦 15世纪,他的名字是Xaverius Endricus Remius Ontius Xendrianus(施乐)。不管怎么说,这工作很烦人,也很无聊。及 加快速度的唯一办法是雇佣更多的抄写员

从前,有一个剧团想要演出 著名的古代悲剧。这些剧本分为三个部分 当然,许多书和演员需要更多的拷贝。所以他们 雇了许多抄写员来抄写这些书。想象一下,你有我 书籍(编号为1、2、…、m)的数量可能不同 页面(p_1,p_2,…,p_m),您希望每个页面各复制一份
是的。您的任务是将这些书分成k个抄写员,这里有一个可能的用python编写的动态编程解决方案。我使用从0开始的索引

k = 2  # number of scribes
# number of pages per book. 11 pages for first book, 1 for second, etc.
pages = [11, 1, 1, 10, 1, 1, 3, 3]
m = len(pages)  # number of books


def find_score(assignment):
    max_pages = -1
    for scribe in assignment:
        max_pages = max(max_pages, sum([pages[book] for book in scribe]))
    return max_pages


def find_assignment(assignment, scribe, book):
    if book == m:
        return find_score(assignment), assignment
    assign_current = [x[:] for x in assignment]  # deep copy
    assign_current[scribe].append(book)
    current = find_assignment(assign_current, scribe, book + 1)
    if scribe == k - 1:
        return current
    assign_next = [x[:] for x in assignment]  # deep copy
    assign_next[scribe + 1].append(book)
    next = find_assignment(assign_next, scribe + 1, book + 1)
    return min(current, next)


initial_assignment = [[] for x in range(k)]
print find_assignment(initial_assignment, 0, 0)
函数find_assignment将赋值作为列表返回,其中第i个元素是分配给第i个scribe的图书索引列表。作业的分数也会返回(抄写员在作业中必须复制的最大页数)

动态规划的关键是首先识别子问题。在这种情况下,书籍是有序的,只能按顺序分配。因此,子问题是使用s划线(其中n
k = 2  # number of scribes
# number of pages per book. 11 pages for first book, 1 for second, etc.
pages = [11, 1, 1, 10, 1, 1, 3, 3]
m = len(pages)  # number of books


def find_score(assignment):
    max_pages = -1
    for scribe in assignment:
        max_pages = max(max_pages, sum([pages[book] for book in scribe]))
    return max_pages


def find_assignment(assignment, scribe, book):
    if book == m:
        return find_score(assignment), assignment
    assign_current = [x[:] for x in assignment]  # deep copy
    assign_current[scribe].append(book)
    current = find_assignment(assign_current, scribe, book + 1)
    if scribe == k - 1:
        return current
    assign_next = [x[:] for x in assignment]  # deep copy
    assign_next[scribe + 1].append(book)
    next = find_assignment(assign_next, scribe + 1, book + 1)
    return min(current, next)


initial_assignment = [[] for x in range(k)]
print find_assignment(initial_assignment, 0, 0)