我有以下list
个数字(1,3,4,5,7,9,10,12,15
),我想找出此3
中list
个数的所有可能组合,这些数字将合计为{ {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))
}
}
中的输出显示数字列表。
任何帮助都将不胜感激。
答案 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)