如何 select 集合中最小的数字子集加起来达到目标​​?

How to select the smallest subset of numbers from a set which add up to a target?

我在这个网站上找了很多这个问题,但找不到解决这个问题的人。

我有一个号码,就是目标。

我有一个数字列表,其中总是有一些零。这些值是有索引的,比如

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

现在我希望它成为 select data$a 中可能的最小子集,让我们称它为 c,其中 sum(c) 大于或等于 870。我不知道递归如何工作得很好,但我认为这是用它来完成的。这类似于背包问题,但这里的容量必须超出尽可能小的值,这里的背包对象的 profit/weights 都是一样的。

这不行吗?

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

sort data in 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)

我们可以order数据降序排列,然后得到它的累加和,与'target'比较得到最大索引和有序向量的子集

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