2012-09-21 38 views
0

考虑蟒蛇下面的代码:Python列表尺寸大小错误

def main(): 
    n = input() 
    s = input() 

    coins = [ 0 ]*n 
    dp = [ 0 ]*(s+1) 

    print coins 
    print dp 

    for i in range(n) : 
     coins[ i ] = input() 

    dp[ 0 ]=0 
    dp[ 1 ]=1 

    for i in range(2, s+1) : 
     min_val = 999999 
     for j in range(0, n) : 
      if i-coins[ j ] > 0 : 
       if dp[ i-coins[ j ] ] + 1 < min_val : 
        min_val = dp[ i-coins[ j ] ] + 1 


    print coins 
    print dp 

    print coins[ s ] 

if __name__ == "__main__" : 
    main() 

当我编译并运行这个程序,我得到以下运行时错误:

File "test.py", line 33, in <module> 
    main(); 
File "test.py", line 30 in main 
    if dp[ i-coins[ j ] ] + 1 < min_val : 

IndexError: list index out of range 

这有什么错呢?

输入:

5 10 
1 3 5 7 9 
+2

你不*需要在Python中使用';'分号。它们只会增加噪音。 –

+0

鉴于您已经在上面的行中使用了'coins [j]'这个表达式,那不可能是。尝试打印该表达式的值。 –

+2

你为什么要导入'array'?你没有使用该模块中的任何功能。 –

回答

1

尝试使用

coins = [ 0 ]*n 
dp = [ 0 ]*(s+1) 

给init阵列。

File "ttt.py", line 31, in <module> 
    main() 
    File "ttt.py", line 21, in main 
    if dp[ i-coins[ j ] ] + 1 < min_val : 
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 

print dp[s]而非print coins[s]最后一行:

我在我的机器上有一个总不同的错误。

+0

正确,但仍然有错误。 –

+0

@RondogiannisAristophanes,我添加了一个换行符... – Marcus

+0

非常感谢! –

0

DP为s + 1米的长度,但你的for循环去到n。如果s + 1> n那么这将工作。但在这种情况下,我认为你的s + 1 < n。

dp = [ None ]*(s+1); # dp is s+1 in length. 

for j in range(0, n) # loop goes to n. 

列表索引超出范围意味着S + 1 <Ñ

1

我们知道(从上一行if),该i-coins[ j ] > 0,所以它必须大于或等于len(dp),其是s + 1i小于s+1,所以coins[ j ]是负数。

您是否为coins之一输入负数?

+0

不,我没有... –