Algorithm 复制书籍UVa在线判断动态编程解决方案
我可以使用二进制搜索方法来解决这个问题,因为它很容易实现。但是我刚刚开始解决动态编程问题,我想知道这个问题的动态编程解决方案 在书籍印刷术发明之前,很难制造出一种新的印刷品 一本书的副本。所有的内容都必须由so手写 称为抄写员。抄写员得到了一本书,几天后 几个月后,他完成了它的副本。一位最著名的抄写员住在伦敦 15世纪,他的名字是Xaverius Endricus Remius Ontius Xendrianus(施乐)。不管怎么说,这工作很烦人,也很无聊。及 加快速度的唯一办法是雇佣更多的抄写员 从前,有一个剧团想要演出 著名的古代悲剧。这些剧本分为三个部分 当然,许多书和演员需要更多的拷贝。所以他们 雇了许多抄写员来抄写这些书。想象一下,你有我 书籍(编号为1、2、…、m)的数量可能不同 页面(p_1,p_2,…,p_m),您希望每个页面各复制一份Algorithm 复制书籍UVa在线判断动态编程解决方案,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我可以使用二进制搜索方法来解决这个问题,因为它很容易实现。但是我刚刚开始解决动态编程问题,我想知道这个问题的动态编程解决方案 在书籍印刷术发明之前,很难制造出一种新的印刷品 一本书的副本。所有的内容都必须由so手写 称为抄写员。抄写员得到了一本书,几天后 几个月后,他完成了它的副本。一位最著名的抄写员住在伦敦 15世纪,他的名字是Xaverius Endricus Remius Ontius Xendrianus(施乐)。不管怎么说,这工作很烦人,也很无聊。及 加快速度的唯一办法是雇佣更多的抄写
是的。您的任务是将这些书分成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划线(其中nk = 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)