创建一组不超过34的数字

时间:2018-03-05 17:06:09

标签: r

我需要创建一组数字,总结得不到34。

例如:我有一个数组x<-c(28,26,20,5,3,2,1),我需要创建以下群组:a=(28,5,1)b=(26,3,2)c=(20)因为群组的总和{{1} },ab不超过34。

是否可以在R?

中实现此过程

2 个答案:

答案 0 :(得分:1)

如果我理解正确,这就是你想要做的事情:

create_groups <- function(input, threshold) {
  input <- sort(input, decreasing = TRUE)
  result <- vector("list", length(input))
  sums <- rep(0, length(input))
  for (k in input) {
    i <- match(TRUE, sums + k <= threshold)
    if (!is.na(i)) {
      result[[i]] <- c(result[[i]], k)
      sums[i] <- sums[i] + k
    }
  }
  result[sapply(result, is.null)] <- NULL
  result
}

create_groups(x, 34)
# [[1]]
# [1] 28  5  1
#
# [[2]]
# [1] 26  3  2
#
# [[3]]
# [1] 20

但是,无法保证此贪心算法将以组数的形式输出最佳解决方案。例如:

y <- c(18, 15, 11, 9, 8, 7)
create_groups(y, 34)
# [[1]]
# [1] 18 15
# 
# [[2]]
# [1] 11  9  8
# 
# [[3]]
# [1] 7

虽然这种情况下的最优解只包含两组:list(c(18, 9, 7), c(15, 11, 8))

答案 1 :(得分:0)

假设您想要满足此条件的x的子集的所有可能组合,您可以使用

x = c(28,26,20,5,3,2,1)
y = lapply(seq_along(x), function(y) combn(x, y)) # list all combinations of all subsets
le34 = sapply(y, function(z) colSums(z) <= 34) # which sums are less than 34
lapply(seq_along(y), function(i) y[[i]][,le34[[i]]] ) # list of combinations that meet condition