这与动态规划本身没有太大关系。
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]
由于这里给定的列表包含 一个 零,因此它将生成一个包含 S+1 零的列表。
终于
dp[0] = 0
将第一个元素设置为零。但既然已经如此,这条线就不是很有用了。