从列表中获取所有数字组合,这些数字将合计为特定数字

时间:2018-05-26 07:19:29

标签: r

我有以下list个数字(1,3,4,5,7,9,10,12,15),我想找出此3list个数的所有可能组合,这些数字将合计为{ {1}}。

我对20的研究使我发表了这篇文章: Finding all possible combinations of numbers to reach a given sum

Mark提供的解决方案如下:

stackoverflow

但是我很难尝试调整这组代码来匹配我的问题。或者可能有一个更简单的解决方案?

我希望subset_sum = function(numbers,target,partial=0){ if(any(is.na(partial))) return() s = sum(partial) if(s == target) print(sprintf("sum(%s)=%s",paste(partial[-1],collapse="+"),target)) if(s > target) return() for( i in seq_along(numbers)){ n = numbers[i] remaining = numbers[(i+1):length(numbers)] subset_sum(remaining,target,c(partial,n)) } } 中的输出显示数字列表。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以使用combn功能和过滤功能来满足您的条件。我已经在两个步骤中进行了以下计算,但也可以单步执行。

v <-  c(1,3,4,5,7,9,10,12,15)
AllComb <- combn(v, 3)   #generates all combination taking 3 at a time.
PossibleComb  <- AllComb[,colSums(AllComb) == 20]  #filter those with sum == 20

#Result: 6 sets of 3 numbers (column-wise) 
PossibleComb
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1    1    1    3    3    4
# [2,]    4    7    9    5    7    7
# [3,]   15   12   10   12   10    9
# 

# Result in list
split(PossibleComb, col(PossibleComb))

# $`1`
# [1]  1  4 15
# 
# $`2`
# [1]  1  7 12
# 
# $`3`
# [1]  1  9 10
# 
# $`4`
# [1]  3  5 12
# 
# $`5`
# [1]  3  7 10
# 
# $`6`
# [1] 4 7 9

答案 1 :(得分:1)

combn还有一个FUN参数,我们可以根据条件将其描述为list然后Filter list元素输出

Filter(function(x) sum(x) == 20, combn(v, 3, FUN = list))
#[[1]]
#[1]  1  4 15

#[[2]]
#[1]  1  7 12

#[[3]]
#[1]  1  9 10

#[[4]]
#[1]  3  5 12

#[[5]]
#[1]  3  7 10

#[[6]]
#[1] 4 7 9

数据

v <-  c(1,3,4,5,7,9,10,12,15)