我的老师给了我这段代码:
def n_o_c(Q,v):
M=[None]*(Q+1)
m={}
M[0]=0
for q in xrange(1,Q+1):
M[q]=min(M[q-a]+1 for a in v if q-a>=0)
return M[Q],m
print n_o_c(18,[1,2,5])
首先,我解释了脚本,这是一台假定的投币机,我必须知道我需要多少硬币才能支付Q个数量(含v个硬币)(对于18个3x5硬币,1x2硬币和1x1硬币,我们可以做的硬币可能是IE减少)
我不明白那条M [q]行是什么,我尝试打印M,结果是从1到18的每个数字都需要多少个硬币才能完成该数字。M = [0,1,1,2,2,3,2,2,3,3,2,3,3,4,4,3,4,4,5] q = [0,1,2, 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
有人可以向我解释一下最小的工作原理吗?
我已经做过了(我知道这不是解决练习的好方法,但我不知道有更好的方法)。解决了:
def n_o_c(Q,v):
M=[None]*(Q+1)
m={}
M[0]=0
for q in xrange(1,Q+1):
M[q]=min(M[q-a]+1 for a in v if q-a>=0)
monedas=0
total=Q
m=[] # did this to change dictionary to array
while(monedas<M[Q]):
for a in v[::-1]:
if total-a >= 0:
total = total-a
monedas = monedas +1
m.append(a)
break #I forget this break
return M[Q],m
print n_o_c(18,[1,2,5])
该min
功能是简单的部分:
以迭代方式返回最小的项目
棘手的一点是,可迭代的功能是什么?
M[q]=min(M[q-a]+1 for a in v if q-a>=0)
这(M[q-a]+1 for a in v if q-a>=0)
称为生成器表达式;更一般地说,这是一种理解。
从官方教程中的列表理解开始,以了解一般的理解方式,然后是迭代器和以下两个部分(生成器和生成器表达式),以了解生成器表达式有何不同。*
但我可以在这里总结一下,至少足以让您入门。
首先,列表理解:
[M[q-a]+1 for a in v if q-a>=0]
这意味着您要构建一个列表,就像您将其展开到这样的循环中一样:
value = []
for a in v:
if q-a>=0:
value.append(M[q-a]+1)
M[q] = min(value)
或者,更直观,尝试朗读吧:每一个列表M[q-a]+1
每个a
中v
,如果q-a>=0
有意义的,因为一个英文句子,和手段完全同样的事情了Python。(如果您有数学背景,则可能想用集合显示来思考它,但是我假设您没有。)
生成器表达式执行相同的操作,除了生成列表而不是构建列表之外,它在您对其进行迭代时根据需要创建值。您可以将其视为一种神奇的列表,它现在不会浪费内存或时间。要在Python中进行拼写,只需将方括号[]
变成括号()
(在本例中可以省略括号,因为min
调用中已经有括号)。要大声朗读,只需离开“列表清单”部分。
*掌握了这一点之后,如果您想了解更多信息,请看一下itertools
模块,阅读David Beazley撰写的System Programmers的Generator Tricks和google,了解Greg Ewing的有关发电机的演示。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句