【发布时间】:2021-02-07 13:23:09
【问题描述】:
(为清晰起见已于 2021 年 2 月 8 日修订)
这类似于这里的问题:
Find combinations of size r from a set with decreasing sum value
这与上面链接中发布的答案不同,因为我正在寻找没有“size r=3”的答案。
我有一组(数组)数字。
我需要将数字组合的总和从最大到最小排序,并显示数组中用于获取该行总数的数字。
数组中的任何数字每行只能使用一次,但随着总数的减少,不必在每行中使用所有数字。
如果未使用数字,则应使用零作为占位符,以便我可以创建列对齐的 CSV 文件。
输入示例 #1,数组中有 7 个数字:[30,25,20,15,10,5,1]
所需的输出示例#1格式,其中每行中的最后一个数字是该行的总和(总和):
Beginning of list
30,25,20,15,10,5,1,106
30,25,20,15,10,5,0,105
30,25,20,15,10,0,1,101
30,25,20,15,10,0,0,100
...(all number combinations in between)
30,0,0,0,0,0,0,30
0,25,0,0,0,5,0,30
...(all number combinations in between)
0,0,0,15,0,0,1,16
0,0,0,15,0,0,0,15
0,0,0,0,10,5,0,15
0,0,0,0,10,0,1,11
0,0,0,0,0,5,1,6
0,0,0,0,0,5,0,5
0,0,0,0,0,0,1,1
End of list
此外,允许重复总计,并且首选显示具有相同行总计(总和)的不同组合。 例如#1:
30,0,0,0,0,0,0,30
0,25,0,0,0,5,0,30
例如,这是基于上面输入示例 #1 的一行输出:
30,25,0,0,0,5,1,61
行中的最后一个数字是总数。总数也可以是第一个数字,但重要的是输出列表按总数降序排列。
输入示例 #2,数组中有 5 个数字:[20,15,10,5,1]
所需的输出示例#2格式,其中每行中的最后一个数字是该行的总数(总和):
Beginning of list
20,15,10,5,1,51
20,15,10,5,0,50
20,15,10,0,1,46
20,15,10,0,0,45
...(all number combinations in between)
20,0,10,0,0,30
0,15,10,5,0,30
...(all number combinations in between)
0,15,0,0,1,16
0,15,0,0,0,15
0,0,10,5,0,15
0,0,10,0,1,11
0,0,10,0,0,10
0,0,0,5,1,6
0,0,0,5,0,5
0,0,0,0,1,1
End of list
输入示例 #1:[30,25,20,15,10,5,1]
输出的每一行都应该显示数组中的每个数字,每行最多只使用一次,以获得该行的总数。 行必须按用于获得总数的数字之和以降序排序。
列表中的第一个输出行将显示 30 + 25 + 20 + 15 + 10 + 5 + 1 = 106 的结果
列表中的第二个输出行将显示 30 + 25 + 20 + 15 + 10 + 5 + 0 = 105
列表中的第三个输出行将显示 30 + 25 + 20 + 15 + 10 + 0 + 1 = 101 的结果
...其余行将继续,该行的总和(总和)越来越小,直到达到 1...
列表中倒数第三个输出行将显示结果 0 + 0 + 0 + 0 + 0 + 5 + 1 = 6
列表中倒数第二个输出行将显示结果 0 + 0 + 0 + 0 + 0 + 5 + 0 = 5
列表中的最后一个输出行将显示 0 + 0 + 0 + 0 + 0 + 0 + 1 = 1 的结果
我从用户Divyanshu 提供的代码开始,修改了不同的输入数字,并将 () 添加到最后一行(但我需要使用数组中的所有数字而不是 size=4,如下所示):
import itertools
array = [30,25,20,15,10,5,1]
size = 4
answer = [] # to store all combination
order = [] # to store order according to sum
number = 0 # index of combination
for comb in itertools.combinations(array,size):
answer.append(comb)
order.append([sum(comb),number]) # Storing sum and index
number += 1
order.sort(reverse=True) # sorting in decreasing order
for key in order:
print (key[0],answer[key[1]]) # key[0] is sum of combination
所以这就是我需要的输入(在本例中):
[30,25,20,15,10,5,1]
size=4 将输出限制为数组中的 4 个数字。 如果我取出 size=4 我会得到一个错误。我需要使用整个数字数组。
我可以手动将 size=4 更改为 size=1 并运行它然后 size=2 然后运行它等等。
在代码中输入 size=1 到 size=7 并运行它(在本例中为 7 次)以获取所有可能组合的列表,这给了我 7 个不同的输出。
然后我可以手动将列表放在一起,但这不适用于更大的数字集(数组)。
我可以修改上面引用的代码还是需要使用其他方法?
【问题讨论】:
标签: python algorithm combinations combinatorics discrete-mathematics