Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
无法在python中实现动态编程表算法_Python_Algorithm_Dynamic Programming - Fatal编程技术网

无法在python中实现动态编程表算法

无法在python中实现动态编程表算法,python,algorithm,dynamic-programming,Python,Algorithm,Dynamic Programming,我在用python创建表时遇到问题。基本上,我想建立一个表,每个数字告诉我,如果我可以用它来分解另一个,表algo从中接受的答案。以下是伪代码: for i = 1 to k for z = 0 to sum: for c = 1 to z / x_i: if T[z - c * x_i][i - 1] is true: set T[z][i] to true 以下是我的python实现: from collect

我在用python创建表时遇到问题。基本上,我想建立一个表,每个数字告诉我,如果我可以用它来分解另一个,表algo从中接受的答案。以下是伪代码:

for i = 1 to k
    for z = 0 to sum:
        for c = 1 to z / x_i:
            if T[z - c * x_i][i - 1] is true:
                set T[z][i] to true
以下是我的python实现:

from collections import defaultdict


data = [1, 2, 4]
target_sum = 10

# T[x, i] is True if 'x' can be solved
# by a linear combination of data[:i+1]
T = defaultdict(bool)           # all values are False by default
T[0, 0] = True                # base case


for i, x in enumerate(data):    # i is index, x is data[i]
    for s in range(target_sum + 1): #set the range of one higher than sum to include sum itself
        for c in range(s / x + 1):  
            if T[s - c * x, i]:
                T[s, i+1] = True

#query area   
target_result = 1
for node in T:
    if node[0]==target_result:
        print node, ':', T[node]
所以我期望的是,如果target_result设置为8,它将显示如何使用列表数据中的每个项来分解该数字。对于8,1,2,4的所有工作,所以我希望他们都是真的,但这个程序使一切都成为真的。例如,1应该只能被1分解,而不能被2或4分解,但当我将其作为1运行时,我得到:

(1, 2) : True
(1, 0) : False
(1, 3) : True
(1, 1) : True
有人能帮我理解代码的错误吗?或者我不理解我所指的答案中的算法

注意:我可能完全错了,但我了解到defaultdict即使不存在也会创建条目,如果条目存在,则algo会将其变为真,也许这就是我不确定的问题,但这是我尝试过的思路,但它对我无效,因为它似乎破坏了整体实现 谢谢

您的代码是正确的

1=1*1+0*2,所以T[1,2]是真的

1=1*1+0*2+0*4,所以T[1,3]是真的

根据评论中的要求,对algo进行简短解释: 它计算从0到targetsum的所有数字,这些数字可以表示为数据中某些数字的非负倍数之和。 如果T[s,i]为真,则可以仅使用数据的前i个元素以这种方式表示s

开始时,0可以表示为空和,因此T[0,0]为真。这一步似乎有点技术性。
设x为数据的第i+1个元素。然后,如果可以用x的某个倍数和一个仅使用数据前i个元素的表示存在的数字的和来表示,则该算法尝试对每个数字s进行计算。对于某些c,这种数字的存在意味着T[s-c*x,i]为真。如果是这样,则只能使用数据的前i+1元素表示s。

如果使用以下方法打印解决方案,则代码有效:


顺便说一句,你并不需要一个默认的dict,你可以使用一个普通的dict+。获取:

数据=[1,2,4] 目标总和=10 T={} T[0,0]=真 对于枚举数据中的i,x: 对于python-2.x上rangetarget_sum+1:xrange中的s 对于范围为//x+1的c: 如果T.get-c*x,i: T[s,i+1]=真 如果您使用的是J.S.解决方案,请不要忘记更改:

if T[sum - c * x_k, k - 1]:
与:


那我一定不懂算法。我认为在您的案例中,最后一个数字2和3代表了要使用的变量在数据列表上的位置。我想澄清一下,这些数字是什么意思?我想我没有正确地解释它们?当您将1更改为8时也会得到相同的结果。2和3意味着您可以使用数据的前2或3个元素,而不仅仅是数字2或3。非常感谢!它起作用了!我试着把问题分成几个部分来解决,但我想我需要整个问题。我想桌子看起来会不一样。我将对它进行研究,但看起来我可以在一台机器上运行表生成,然后让其他机器使用生成的表,并递归地列出所有用于扩展它的工作。我会测试它,但非常感谢你!谢谢,我来试试。只是想知道我是python新手,避免导入可以自己创建的函数更好还是导入更好?我认为导入可能不利于内存的使用,但创建库的人也可能提高了它的效率。我有点矛盾,所以不确定哪一个更好。@Lostsoul:不,不要回避。如果你正在构建一个你已经有很多事情要担心的程序,如果其他人给你提供了一些可以帮助你的东西,那就用它吧!有一件事不用担心。他会为你保管那东西的。还要记住,过早的优化是最邪恶的根源。首先让事情开始工作,然后看看性能/内存问题。你可能想看看这个。
10*1 +  0*2 +  0*4
 8*1 +  1*2 +  0*4
 6*1 +  2*2 +  0*4
 4*1 +  3*2 +  0*4
 2*1 +  4*2 +  0*4
 0*1 +  5*2 +  0*4
 6*1 +  0*2 +  1*4
 4*1 +  1*2 +  1*4
 2*1 +  2*2 +  1*4
 0*1 +  3*2 +  1*4
 2*1 +  0*2 +  2*4
 0*1 +  1*2 +  2*4
if T[sum - c * x_k, k - 1]:
if T.get((sum - c * x_k, k - 1)):