我正在尝试学习动态编程,但是有些难懂的代码行却很难理解。知道我们应该如何处理以下几行代码:
n, S = map(int, input().split())
w = list(map(int, input().split()))
dp = [0] * (S + 1)
dp[0] = 0
答案 0 :(得分:3)
这与动态编程本身无关。
n, S = map(int, input().split())
将查询用户的输入,然后将其分解为单词,将这些单词转换为整数,然后将其解压缩为两个变量n
和S
。因此,当用户输入两个数字(不多于不少)时,此操作将成功。
它的工作原理如下:
input()
将查询用户的输入,并读取一行用户输入; .split()
会将输入拆分为“单词”列表; map(int, ...)
将在每个单词上调用int
,它会懒惰地调用(尽管在此并不重要);和n, S = ...
将表达式分解为两个元素,并将第一个元素分配给n
,将第二个元素分配给S
。例如:
>>> n, S = map(int, input().split())
14 25
>>> n
14
>>> S
25
但是如果仅传递一个数字,三个数字等,则会出错:
>>> n, S = map(int, input().split())
14
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 2, got 1)
>>> n, S = map(int, input().split())
14 25 37
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
>>> n, S = map(int, input().split())
foo bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'foo'
该行:
w = list(map(int, input().split()))
或多或少地做相同的事情,但取而代之的是从用户那里输入一系列数字。可以有零个,一个或多个数字。 w
将存储数字列表。 list(..)
部分迫使Python急切地评估map(..)
。
dp = [0] * (S + 1)
在这里,我们将构建一个包含S + 1
零的列表。在Python中,您可以将列表(和元组)与整数 n 相乘。结果是一个列表(或元组),其大小是原始列表的 n 倍,并且重复了元素。例如:
>>> [1,4,2,5] * 3
[1, 4, 2, 5, 1, 4, 2, 5, 1, 4, 2, 5]
由于此处给定的列表包含 one 零,因此它将产生包含S+1
零的列表。
最后
dp[0] = 0
会将第一个元素设置为零。但是既然已经是这种情况,那么此行就不是很有用。