如何从一组数字中选择最小的数字子集,这些数字加起来就是一个目标?

时间:2019-05-10 04:20:11

标签: r recursion combinatorics

我在此站点上对这个问题的关注很多,但找不到解决这个问题的人。

我有一个数字,这是目标。

我有一个数字列表,里面总是有零。这些值已编入索引,例如

a<-c(0,0,110,120,200,250,300,0,0,200,330,0,0,400)
b<-1:14
data<-cbind(b,a)
target<-870

现在,我希望它从data$a中选择最小的子集,将其命名为c,其中sum(c)大于或等于870。我不知道递归如何效果很好,但我认为必须使用它。这类似于背包问题,但是这里的容量必须以尽可能小的值来超过,此处背包对象的利润/权重都相同。

2 个答案:

答案 0 :(得分:0)

这行不通吗?

inds <- sort(data$a, decreasing = TRUE)
inds[1:which.max(cumsum(inds) > target)]
#[1] 400 330 300

sortdata的顺序decreasing,找到第一个索引,其中值传递target并将其子集化。

数据

a <- c(0,0,110,120,200,250,300,0,0,200,330,0,0,400)
b <- 1:14
data <- data.frame(b,a)

答案 1 :(得分:0)

我们可以order递减数据,然后获得它的累积总和,将其与“目标”进行比较以获得最大索引并对有序向量进行子集

i1 <- data[,"a"][order(-data[, "a"])]
i1[seq_len(which.max(cumsum(i1) > target))]
#[1] 400 330 300

数据

a <- c(0,0,110,120,200,250,300,0,0,200,330,0,0,400)
b <- 1:14
data <- cbind(b,a)
target <- 870