在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
答案 0 :(得分:1)
我们知道(来自上一行if
)i-coins[ j ] > 0
,因此它必须大于或等于len(dp)
,即s + 1
。 i
小于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; Ñ