Получение всех комбинаций чисел из списка, которые суммируются с определенным числом - PullRequest
0 голосов
/ 26 мая 2018

У меня есть следующие list чисел (1,3,4,5,7,9,10,12,15), и я хочу найти все возможные комбинации 3 чисел из этого list, которые бы составили 20.

Мои исследования 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))
}
}

Однако я с трудом пытаюсь настроить этот набор кодов, чтобы он соответствовал моей проблеме.Или, может быть, есть более простое решение?

Я хочу, чтобы вывод в R показал мне список чисел.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

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

data

v <-  c(1,3,4,5,7,9,10,12,15)
0 голосов
/ 26 мая 2018

Вы можете использовать функцию combn и фильтр, чтобы соответствовать вашим критериям.Я выполнил приведенный ниже расчет в 2 этапа, но можно выполнить его и за один шаг.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...