-
27-09-2019 - |
题
考虑中,你必须N
值的问题,你需要计算有多少方法可以使用N
美钞总结到[1,2,5,10,20,50,100]
美元。
考虑经典DP溶液:
C = [1,2,5,10,20,50,100]
def comb(p):
if p==0:
return 1
c = 0
for x in C:
if x <= p:
c += comb(p-x)
return c
它并不需要生效求和部件的顺序。例如,comb(4)
将产生5个结果:[1,1,1,1],[2,1,1],[1,2,1],[1,1,2],[2,2]
而实际上有3个结果([2,1,1],[1,2,1],[1,1,2]
都是相同的)
什么是DP成语用于计算这个问题? (非优雅解决方案,例如产生所有可能的解决方案和删除重复不欢迎)
解决方案
您不应该从每次begining去,但在最大距离是你在每个深度来了。 意味着你必须通过两个参数,启动和剩余总
C = [1,5,10,20,50,100]
def comb(p,start=0):
if p==0:
return 1
c = 0
for i,x in enumerate(C[start:]):
if x <= p:
c += comb(p-x,i+start)
return c
或等价物(可能更可读的)
C = [1,5,10,20,50,100]
def comb(p,start=0):
if p==0:
return 1
c = 0
for i in range(start,len(C)):
x=C[i]
if x <= p:
c += comb(p-x,i)
return c
其他提示
不知道任何DP成语,但你可以尝试使用生成函数的。
,我们需要找到什么是X ^ N的系数中
(1 + X + X ^ 2 + ...)(1 + X ^ 5 + X ^ 10 + ...)(1 + X ^ 10 + X ^ 20 + ...)...( 1 + X ^ 100 + X ^ 200 + ...)
(次数1次出现* 1 +的次数出现5 * 5 + ...)
这是相同的倒数
(1-X)(1-x ^ 5)(1-x ^ 10)(1-x ^ 20)(1-x ^ 50)(1-x ^ 100)。
您现在可以在单位根的产品方面各因式分解,在部分分式的条款分割的倒数(其为一个时间步长),并找到的X ^ N在每个系数(这将是以下形式的多项式/(XW)),并且把它们加起来。
您可以做一些DP计算团结的根源。
术语:什么你正在寻找的是“整数分区” 到prescibed部分(应更换标题中包含“组合”)。 忽视问题的“动态规划”的一部分,常规 你的问题是,在第16章的第一部分中给出 在fxtbook的(“整数分区”,p.339ff),在网上 http://www.jjj.de/fxt/#fxtbook