当前位置: 首页 > 知识库问答 >
问题:

得到给定乘积总和内所有可能的组合

澹台正业
2023-03-14

我想写一个R脚本,它将生成一个集合数的所有可能组合,其乘积总和低于某个总数。

例如,我有这两个向量,x表示我要为其生成组合的元素,y表示要求乘积和的元素。

<代码>x

<代码>y

我这里的主要约束是x的任何组合的总和必须小于或等于1244。

|--------------|--------------|--------------|---------------------|
|  Total of 2  |  Total of 4  |  Total of 6  |  Total Product Sum  |
|--------------|--------------|--------------|---------------------|
|       1      |      1       |       1      |         144         |
|--------------|--------------|--------------|---------------------|
|       2      |      2       |       2      |         288         |    
|--------------|--------------|--------------|---------------------|
|       3      |      3       |       3      |         432         |    
|--------------|--------------|--------------|---------------------|
|       4      |      4       |       4      |         576         |    
|--------------|--------------|--------------|---------------------|
|       5      |      5       |       5      |         720         |    
|--------------|--------------|--------------|---------------------|
|      ...     |      ...     |      ...     |         ...         |    
|--------------|--------------|--------------|---------------------|

我尝试使用以下代码,但它只能线性工作,而不是生成小于或等于1244的所有可能组合。

n_trials <- 30
# data frame to store all possible combinations and their product sum
combo_data <- data.frame(total_of_2 = rep(0,n_trials)
                             , total_of_4 = rep(0,n_trials)
                             , total_of_6 = rep(0,n_trials)
                             , total_product_sum = rep(0,n_trials))

 for (i in 1:n_trials) {
 # check that combination is at most 1244 sqft
   if (i*24 + i*48 + i*72 <= 1244) {
     # track number of each element in x
     combo_data$total_of_2[i] <- i
     combo_data$total_of_4[i] <- i
     combo_data$total_of_6[i] <- i

     # add total product sum
     combo_data$total_product_sum[i] <- i*24 + i*48 + i*72
   }
 }

 view(combo_data)

共有3个答案

陶裕
2023-03-14

如果我理解正确:

tibble(X=1:30, Y=1:30, Z=1:30) %>% 
  expand(X, Y, Z) %>% 
  mutate(Total=X*24 + Y*48 + Z*72) %>% 
  filter(Total <= 1244)
# A tibble: 2,990 x 4
       X     Y     Z Total
   <int> <int> <int> <dbl>
 1     1     1     1   144
 2     1     1     2   216
 3     1     1     3   288
 4     1     1     4   360
 5     1     1     5   432
 6     1     1     6   504
 7     1     1     7   576
 8     1     1     8   648
 9     1     1     9   720
10     1     1    10   792
# … with 2,980 more rows

你的解决方案失败了,因为你没有循环total_of_

壤驷阳波
2023-03-14
匿名用户

从展开开始。网格具有所有可能的组合,然后使用矩阵乘法。

x <- c(24, 48, 72)
e <- expand.grid(X = seq_len(30), Y = seq_len(30), Z = seq_len(30))

y <- as.vector(x %*% t(e))
z <- cbind(e[y < 1244, ], Prod = y[y < 1244])

head(z)
#  X Y Z Prod
#1 1 1 1  144
#2 2 1 1  168
#3 3 1 1  192
#4 4 1 1  216
#5 5 1 1  240
#6 6 1 1  264

颛孙智勇
2023-03-14

1244下有效组合的数量将随着你增加而增加,所以我不完全清楚这里的目标。也就是说,这是一个使用base R的版本:

y <- c(24,48,72) #elements to find product sum
n <- 30
instances <- expand.grid(1:n, 1:n, 1:n)
instances$product_sum = rowSums(data.frame(Map('*', instances, y)))
instances <- subset(instances, product_sum <= 1244 )

结果的前几行:

  Var1 Var2 Var3 product_sum
1    1    1    1         144
2    2    1    1         168
3    3    1    1         192
4    4    1    1         216
5    5    1    1         240
6    6    1    1         264

如果只使用原始值2、4和6而不是1:n,则应得到27个有效组合。

 类似资料:
  • 问题内容: 我正在为Android开发一个数学应用程序。在这些字段之一中,用户可以输入一个整数(无数字且大于0)。这个想法是获得所有可能的和,使之成为整数,而不加倍(在这种情况下为4 + 1 == 1 + 4)。唯一已知的是此int。 例如: 假设用户输入4,我希望该应用返回: 4 3 + 1 2 + 2 2 + 1 + 1 1 + 1 + 1 + 1 显然4 == 4,所以也应该加上。关于我应该

  • 我正在尝试构造一个程序,该程序将获取一个int({1,2,3})数组和一个长度值,并计算该数组的所有可能组合。 例如: 这将输出: 但是当我尝试在 for 循环中调用可能的梳子时,我不断收到堆栈溢出错误 }

  • 问题内容: 给定一个长度 和a ,如何编写一些Java代码以产生长度为n的所有可能的字符串,其中包含集合中的字符? 对于上面的示例,结果应具有2 ^ 4 = 16个字符串,即: 这是我的代码段: 好像只是在做排列,而不是我想要的。……在此先谢谢您:) 问题答案: 以与计数相同的方式来考虑它。从技术上讲,您是从aaaa到bbbb进行“计数”,就像二进制一样。 没有看到您尝试过的内容,我不能为您提供更

  • 我正在寻找以下问题的答案。 给定一组整数(无重复项)和一个和,找出集合元素的所有可能组合,并求和。解的顺序并不重要(解{2,2,3}和{3,2,2}是相等的)。 请注意,最终组合不需要是集合,因为它可以包含重复。 示例:集合{2,3,5}和10 结果:{2, 2, 2, 2, 2},{2,2,3,3},{2,3,5},{5,5} 我已经研究过子集和问题以及硬币兑换问题,但不能使它们适应我的需要。我

  • 问题内容: 给出了长度为 n 的数组。查找子数组元素的乘积之和。 说明 数组 A* = 长度 3的 [2,3,4] 。 * 长度为 2的 子数组= [2,3],[3,4],[2,4] [2,3] 中元素的乘积= 6 [3,4] 中元素的乘积= 12 [2,4] 中元素的乘积= 8 长度 2 = 6 + 12 + 8 = 26的子数组的总和 同样,对于长度 3 ,Sum = 24 因此,乘积以模 1

  • 问题内容: 假设我有以下课程: 这是hashCode的正确实现吗?这不是我通常这样做的方式(我倾向于遵循有效的Java准则),但是我总是很想做类似上面的代码的诱惑。 谢谢 问题答案: 这取决于您所说的“正确”。假设您正在使用所有相关的-defining字段,那么是的,它是“正确的”。但是,此类公式可能不会具有良好的分布,因此可能导致比其他情况更多的冲突,这将对性能产生不利影响。 这是来自 有效Ja