【问题标题】:find all possible sums in vector (R)在向量 (R) 中找到所有可能的和
【发布时间】:2014-07-28 18:32:02
【问题描述】:

我有一个像这样 (vec) 的美元值向量:

[1]  460.08 3220.56 1506.20 1363.76 1838.00 1838.00 3684.94 2352.66 1606.02
[10] 1840.05  518.98 1603.53 1556.94  347.32  253.16   12.95 1828.81 1896.32
[19] 4962.60  426.33 3237.04 1601.40 2004.57  183.80 1570.75 3622.96  230.04
[28]  426.33 3237.04 1601.40 2004.57  183.80

如果我有一笔费用来自这些数字的总和,我怎么能找到它?例如,如果电荷是 6747.81,那么它一定是由 1506.20 + 3237.04 + 2004.57(第 3、29 和 31 个向量元素)产生的。给定总和,我如何解决这些向量元素?

我想找到所有可能的总和就是答案,然后将其与导致它的向量元素相匹配。

我玩过使用 combn(vec, 3) 来查找所有 3 个,但这并不能完全满足我的要求。

【问题讨论】:

  • 似乎是背包问题的一个特例,你必须完美地填充它。这是一个 NP 问题,你可能只需要暴力破解它。找到你选择 3 个值的所有组合是行不通的;您需要每个不超过目标值的组合。 IE,有可能你有 10 件便宜的商品或 2 件贵的商品。
  • 除非您的问题仅限于要添加在一起的少量术语,否则这个问题会变得非常有趣。即使只有 32 个数字向量,您也需要计算 43 亿个唯一和(32 选择 1 到 32)。
  • vec <- c(460.08, 3220.56, 1506.20, 1363.76, 1838.00 ,1838.00, 684.94, 2352.66, 1606.02, 1840.05, 518.98, 1603.53, 1556.94, 347.32, 253.16, 12.95, 1828.81, 1896.32, 4962.60, 426.33, 3237.04, 1601.40, 2004.57, 183.80, 1570.75, 3622.96, 230.04, 426.33, 3237.04, 1601.40, 2004.57, 183.80)我的编辑被三次拒绝,因为“原始帖子中的更改太多”,但这里是易于访问格式的示例数据。

标签: r combinations


【解决方案1】:

您需要在combn 之后使用colSums(或apply)来获得总和。

set.seed(100)
# Generate fake data
vec <- rpois(10, 20)
# Get all combinations of 3 elements
combs <- combn(vec, 3)
# Find the resulting sums
out <- colSums(combs)
# Making up a value to search for
val <- vec[2]+vec[6]+vec[8]
# Find which combinations lead to that value
id <- which(out == val)
# Pull out those combinations
combs[,id]

显示此示例结果的一些输出

> vec
 [1] 17 12 23 20 21 17 21 18 22 22
> val
[1] 47
> combs[,id]
     [,1] [,2]
[1,]   17   12
[2,]   12   17
[3,]   18   18

编辑:刚刚看到不一定限制使用 3 个项目。可以通过对每个可能的样本量进行概括来概括这一点,但我现在没有时间这样做。即使是中等规模的问题,它也会相当缓慢。

【讨论】:

  • @Vlo 除非我弄错了,否则不方便查找用于给出每个总和的数字,这是需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多