Python列表维度大小错误

时间:2012-09-21 15:34:12

标签: python list

在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

3 个答案:

答案 0 :(得分:1)

我们知道(来自上一行ifi-coins[ j ] > 0,因此它必须大于或等于len(dp),即s + 1i小于s+1,因此coins[ j ]为负数。

您为其中一个coins输入了否定号码吗?

答案 1 :(得分:1)

尝试使用

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

初始化数组。

我的机器上出现了完全不同的错误:

  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]

答案 2 :(得分:0)

dp是s + 1长度,但你的for循环转到n。如果s + 1>那么这会奏效。但在这种情况下,我认为你的s + 1&lt; Ñ

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

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

列表索引超出范围意味着s + 1&lt; Ñ