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
4

3 に答える 3

1

(前の行からif) がわかっi-coins[ j ] > 0ているので、 よりも大きいか等しい必要があります。len(dp)これはs + 1です。 iより小さいs+1のでcoins[ j ]、負の数です。

のいずれかに負の数を入力しましたcoinsか?

于 2012-09-21T15:38:12.783 に答える
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]

于 2012-09-21T15:48:42.003 に答える
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 < n を意味します

于 2012-09-21T15:37:40.913 に答える