我在此站点上对这个问题的关注很多,但找不到解决这个问题的人。
我有一个数字,这是目标。
我有一个数字列表,里面总是有零。这些值已编入索引,例如
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。我不知道递归如何效果很好,但我认为必须使用它。这类似于背包问题,但是这里的容量必须以尽可能小的值来超过,此处背包对象的利润/权重都相同。
答案 0 :(得分:0)
这行不通吗?
inds <- sort(data$a, decreasing = TRUE)
inds[1:which.max(cumsum(inds) > target)]
#[1] 400 330 300
sort
以data
的顺序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