当前位置: 首页 > 知识库问答 >
问题:

k部分整数划分的秩与反秩

云卓
2023-03-14

对于正整数n和k,让“n的k-分区”是k个加起来等于n的不同正整数的有序列表,让给定n的k-分区的“秩”是它在所有这些列表的有序列表中的位置,从0开始。

例如,有两个5(n)的2分区

所以,我想做两件事:

  • 给定n,k和n的k-划分,我想求n的k-划分的秩。
  • 给定n,k和一个秩,我想找到n的k-划分

我能做到这一点,而不必计算n的所有k-划分,在感兴趣的k-划分之前吗?

这个问题与其他问题不同,因为我们在这里讨论的是整数分区,而不仅仅是组合。

共有1个答案

鲁波光
2023-03-14

这里有一个Python解决方案,它依赖于两个想法。首先,动态规划可以在不生成分区的情况下对分区进行计数。第二,如果第一个值是i,那么我们可以将其视为一个i*k框,将n-i*k划分为k-1块。

partition_cache = {}
def distinct_partition_count (n, k):
    if n < k:
        return 0
    elif n < 1:
        return 0
    elif k < 1:
        return 0
    elif k == 1:
        return 1
    elif (n, k) not in partition_cache:
        answer = 0
        for i in range(1, n/k + 1):
            answer = answer + distinct_partition_count(n - i*k, k-1)
        partition_cache[(n, k)] = answer
    return partition_cache[(n, k)]

def rank_distinct_partition (values):
    values2 = sorted(values)
    n = sum(values)
    k = len(values)
    answer = 0
    highwater = 0
    for v in values:
        rise = v - highwater
        for i in range(1, rise):
            answer = answer + distinct_partition_count(n - k*i, k-1)
        highwater = v
        ## BUG HERE: was n = n - rise
        n = n - rise * k
        k = k - 1
    return answer

def find_ranked_distinct_partition (n, k, rank):
    if k == 1 and rank == 0:
        return [n]
    elif distinct_partition_count(n, k) <= rank:
        return None
    elif rank < 0:
        return None
    else:
        i = 1
        while distinct_partition_count(n - i*k, k-1) <= rank:
            rank = rank - distinct_partition_count(n - i*k, k-1);
            i = i + 1
        answer = find_ranked_distinct_partition(n - i*k, k-1, rank)
        return [i] + [j + i for j in answer]

print(rank_distinct_partition([2, 3])
print(find_ranked_distinct_partition(5, 2, 1))
 类似资料:
  • 我试图找到或开发Python的整数分区代码。 仅供参考,整数分区将给定的整数n表示为小于n的整数之和。例如,整数5可以表示为 我已经找到了很多解决方案。http://homepages.ed.ac.uk/jkellehe/partitions.php和http://code.activestate.com/recipes/218332-generator-for-integer-partition

  • 问题内容: (重新发布,因为我没有对之前的帖子做出任何回应) 我试图编写一个Python代码以将数字为’n’的弱整数组合(分区)转换为’k’部分,但要使用MINIMUM和MAXIMUM每个分区上的值约束(请参见下面的示例)。同样,必须按字典顺序生成分区。我发现了一些相关的帖子,但无法实现。任何帮助将不胜感激。 范例: n = 5的整数分割区(k = 3): [5,0,0],[4,1,0],[4,0

  • 对于正整数n和k,设“n的k-fibonacci位序列”为k的位序列,其中索引上的描述不但是。这些正整数加起来等于n,并让给定的k-fibonnaci位序列n的“秩”作为其在所有这些fibonacci位序列的排序列表中的位置,以字典顺序从0开始。 例如,对于数字39,我们有以下有效的k-斐波那契-比特序列,k 34 21 13 8 5 3 2 1代码 k=2秩=0 k=3秩=0 k=3秩=1 k=

  • 问题内容: 是否存在将数字分割成两个部分(即整数部分和小数部分)的有效方法? 问题答案: 用途:

  • 问题内容: 我需要用0填充整数部分,该整数部分必须至少包含2个字符 是否有简单的代码? 如果可能的话在Java中也一样 不仅难看而且可以打印02.10999999999999988 问题答案: 您也可以使用函数来填充整数: 类似于(键盘):

  • 所以,更正式地说,我得到了N个数字,需要把它们分成K个组,这些组中没有一个是空的。每组范围的总和需要最小。例如: N = 4,K = 2,输入为{5,3,1,1}。 一种可能的解决方案是 {5,3},{1,1}。范围的总和为 2 ((5-3) (1-1))。 另一种方法是{1,1,3}{5},它也是2((3-1)(单个数字的范围是0)。 范围始终是组中最大数字和最小数字之间的差值。 当我搜索互联网