首先,一些定义:
- 给定
n
和k
,考虑多重集的排序列表,对于每个多重集,我们从中选择带有重复的k
数字{0, 1, ..., n-1}
。
例如,对于n=5
和k=3
,我们有:
[(0,0,0),(0,0,1),(0,0,2),(0,0,3),(0,0,4),(0,1,1),( 0,1,2),(0,1,3),(0,1,4),(0,2,2),(0,2,3),(0,2,4),(0, 3、3),(0、3、4),(0、4、4),(1、1、1),(1、1、2),(1、1、3),(1、1, 4),(1、2、2),(1、2、3),(1、2、4),(1、3、3),(1、3、4),(1、4、4) ,(2、2、2),(2、2、3),(2、2、4),(2、3、3),(2、3、4),(2、4、4),( 3,3,3),(3,3,4),(3,4,4),(4,4,4)]
- 甲部分是与所有多集的在部分的交集的大小是至少属性多集的列表
k-1
。也就是说,我们将所有多重集都一次相交(使用多重集相交)。例如,[(1, 2, 2), (1, 2, 3), (1, 2, 4)]
是一个零件,因为其交点的大小为2,但[(1, 1, 3),(1, 2, 3),(1, 2, 4)]
不是,因为它的交点的大小为1。
任务
您的代码应带有两个参数n
和k
。然后,它应该按排序的顺序贪婪地遍历这些多集并输出列表的各个部分。对于这种情况n=5, k=3
,正确的分区是:
(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4)
(0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4)
(0, 2, 2), (0, 2, 3), (0, 2, 4)
(0, 3, 3), (0, 3, 4)
(0, 4, 4)
(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4)
(1, 2, 2), (1, 2, 3), (1, 2, 4)
(1, 3, 3), (1, 3, 4)
(1, 4, 4)
(2, 2, 2), (2, 2, 3), (2, 2, 4)
(2, 3, 3), (2, 3, 4)
(2, 4, 4)
(3, 3, 3), (3, 3, 4)
(3, 4, 4), (4, 4, 4)
这是的另一个示例n = 4, k = 4
。
(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)
(0, 0, 1, 1), (0, 0, 1, 2), (0, 0, 1, 3)
(0, 0, 2, 2), (0, 0, 2, 3)
(0, 0, 3, 3)
(0, 1, 1, 1), (0, 1, 1, 2), (0, 1, 1, 3)
(0, 1, 2, 2), (0, 1, 2, 3)
(0, 1, 3, 3)
(0, 2, 2, 2), (0, 2, 2, 3)
(0, 2, 3, 3), (0, 3, 3, 3)
(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3)
(1, 1, 2, 2), (1, 1, 2, 3)
(1, 1, 3, 3)
(1, 2, 2, 2), (1, 2, 2, 3)
(1, 2, 3, 3), (1, 3, 3, 3)
(2, 2, 2, 2), (2, 2, 2, 3)
(2, 2, 3, 3), (2, 3, 3, 3)
(3, 3, 3, 3)
澄清贪婪的含义: 对于每个多重集,我们依次查看是否可以将其添加到现有零件中。如果可以,我们添加它。如果不能,我们开始一个新的部分。我们按上面给出的示例按排序顺序查看多集。
输出量
您可以按照自己喜欢的任何合理格式输出分区。但是,多集应该水平地写在一行上。那是一个单独的多重集,不应垂直写入或分散在多行上。您可以选择如何分离输出中零件的表示。
假设条件
我们可以假设n >= k > 0
。
(0, 4, 4)
单独使用呢?根据您的描述,我认为它的“组成部分”为(0, 4, 4), (1, 4, 4), (2, 4, 4), (3, 4, 4), (4, 4, 4)
。类似地,对于(0, 0, 3, 3)
在第二测试用例。