我需要创建一组数字,总结得不到34。
例如:我有一个数组x<-c(28,26,20,5,3,2,1)
,我需要创建以下群组:a=(28,5,1)
,b=(26,3,2)
,c=(20)
因为群组的总和{{1} },a
和b
不超过34。
是否可以在R?
中实现此过程答案 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