对于正整数n和k,让“n的k-分区”是k个加起来等于n的不同正整数的有序列表,让给定n的k-分区的“秩”是它在所有这些列表的有序列表中的位置,从0开始。
例如,有两个5(n)的2分区
所以,我想做两件事:
我能做到这一点,而不必计算n的所有k-划分,在感兴趣的k-划分之前吗?
这个问题与其他问题不同,因为我们在这里讨论的是整数分区,而不仅仅是组合。
这里有一个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)。 范围始终是组中最大数字和最小数字之间的差值。 当我搜索互联网