考虑中,你必须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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top