我正在尝试学习动态编程,但有一些难以理解的困难代码行。我不知道我们应该如何处理这些代码行:
n, S = map(int, input().split())
w = list(map(int, input().split()))
dp = [0] * (S + 1)
dp[0] = 0
这和动态规划本身没有太大关系。
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
将把第一个元素设置为零。但由于情况已经如此,这条线并不是很有用。
兄弟,这很容易,对你来说怎么这么难?