我的老师给了我这段代码:
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 * 3硬币1x2硬币的可用IE和1x1硬币)
我不明白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]
有人可以解释一下min的工作原理吗?
我已经做过了(我知道这不是解决练习的好方法,但我不知道更好的方法)。解决:
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])
答案 0 :(得分:2)
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)
被称为生成器表达式;更一般地说,它是一种理解。
从官方教程中的List Comprehensions开始,了解一般工作中的理解,然后Iterators以及以下两个部分(生成器和生成器表达式),以了解生成器表达式的不同之处。*
但我可以在这里总结一下,至少足以让你开始。
首先,列表理解:
[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
调用已经有括号)。要大声朗读,只需留下&#34;&#34;列表&#34;一部分。
*一旦你明白了,如果你想了解更多,请看看itertools
模块,阅读David Beazley的Generator Tricks for System Programmers和Google的Greg Ewing&#39; s关于发电机的介绍。
答案 1 :(得分:0)
为什么我的老师代码中没有使用?
这是一个解决方案: 对v列表进行排序并按每个维度除以得到num硬币并继续更改剩余。
def n_o_c(Q,v):
m = {}
for dimension in sorted(v, reverse= True):
num_coins = int(Q/dimension)
## if Q is not divisible by the dimension, go to the next dimension
if num_coins != 0:
## if Q is divisible, store num_coins in the dictionary
m[dimension] = num_coins
## Get change remaining by modulo function and store it as remaining Q that needs to be broken down
Q = Q % dimension
return m
print n_o_c(18,[1,2,5])
应该打印: {1:1,2:1,5:3}