如何 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
我在这个网站上找了很多这个问题,但找不到解决这个问题的人。
我有一个号码,就是目标。
我有一个数字列表,其中总是有一些零。这些值是有索引的,比如
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