Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 嵌套循环的理解_Loops_Nested_Permutation - Fatal编程技术网

Loops 嵌套循环的理解

Loops 嵌套循环的理解,loops,nested,permutation,Loops,Nested,Permutation,我必须找出有多少种不同的排列方式可以使用三枚硬币创造65枚硬币的总和。 给定列表: 硬币=[200,100,50,20,10,5] 到目前为止,我所尝试的: len(set([x + y + z for x in coins for y in coins for z in coins if (x+y+z)%65 == 0])) 我想我应该使用导入功能 例如,使用随机列表: import itertools len(list(itertools.permutations([1,2,3]))

我必须找出有多少种不同的排列方式可以使用三枚硬币创造65枚硬币的总和。

给定列表:

  • 硬币=[200,100,50,20,10,5]
到目前为止,我所尝试的:

 len(set([x + y + z for x in coins for y in coins for z in coins if (x+y+z)%65 == 0]))
我想我应该使用导入功能

例如,使用随机列表:

import itertools
len(list(itertools.permutations([1,2,3])))

从技术上讲,嵌套循环方法实际上并不能解决这个问题,因为它会包含目标和的倍数,从而导致计数过多。要解决此问题,您只需计算正好为65的数字——请参见此处:

coins = [200, 100, 50, 20, 10, 5]
target = 65

original = len(set([x + y + z for x in coins for y in coins for z in coins if (x + y + z) % 65 == 0]))
print('Original:', original)  # prints 3

new = list(set([x + y + z for x in coins for y in coins for z in coins if (x + y + z) % target == 0])).count(target)
print('Ignoring multiples of 65:', new)  # prints 1
现在,关于你的第二点,这是让人有点困惑的地方。上面实际上计算了组合的数量,而不是排列的数量。相比之下,您最初的声明是关于排列的数量,您使用
itertools
的示例也使用排列。我不确定您的确切意图是什么,但
itertools
为这两种方法提供了一种方法

但是,示例
len(list(itertools.permutations([1,2,3]))
将返回所有置换的计数,而不仅仅是那些与目标值相加的置换。因此,如果您使用
len(list(itertools.permutations(coins))
,则默认情况下,排列的长度为6——您必须为目标长度为3的
itertools.permutations
提供第二个参数

因此,以下内容应适用于您:

import itertools

perms = list(itertools.permutations(coins, 3))  # permutations of length 3
total_perms = len([perm for perm in perms if sum(perm) == target])  # count only those which sum to 65
print('Total permutations:', total_perms)  # prints 6
但是,如果您确实对组合的数量感兴趣——这是原始嵌套循环方法所做的,那么您必须使用
itertools.combinations

combs = list(itertools.combinations(coins, 3))  # combinations of length 3
total_combs = len([comb for comb in combs if sum(comb) == target])  # count only those which sum to 65
print('Total combinations:', total_combs)  # prints 1
祝你好运