You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R语言找出满足固定比值与求和限制的正整数组合

求解满足指定比值与总和上限的正整数组合(R语言实现)

问题描述

找出所有正整数组合(V1, V2),需满足:

  • V1与V2的比值等于指定值rat
  • 两者之和不超过指定上限tot_max(小于上限也符合要求)

示例(rat=0.5,tot_max=16):

V1 V2 ratio(V1/V2) sum  status
1  2   0.5          3   OK
2  4   0.5          6   OK
3  6   0.5          9   OK
4  8   0.5         12   OK
8  16  0.5         24   NOT OK (over 16)

适配任意参数的R代码

find_valid_pairs <- function(tot_max, rat) {
  # 将比值转换为最简分数,避免浮点数精度问题
  rat_frac <- MASS::fractions(rat)
  num <- as.integer(rat_frac@num)
  den <- as.integer(rat_frac@den)
  
  # 计算最大正整数k,确保k*(num+den) ≤ tot_max
  max_k <- floor(tot_max / (num + den))
  
  # 处理无符合条件组合的情况
  if (max_k < 1) {
    return(data.frame(V1 = integer(), V2 = integer(), ratio = numeric(), sum = integer(), status = character()))
  }
  
  # 生成所有有效组合
  k_values <- 1:max_k
  V1 <- num * k_values
  V2 <- den * k_values
  ratio <- V1 / V2
  sum_vals <- V1 + V2
  status <- ifelse(sum_vals <= tot_max, "OK", "NOT OK (over tot_max)")
  
  # 整理为结构化数据返回
  result <- data.frame(V1, V2, ratio, sum = sum_vals, status)
  return(result)
}

# 测试示例参数
find_valid_pairs(tot_max = 16, rat = 0.5)

代码说明

  1. 分数转换:借助MASS::fractions()将比值转为最简分数形式,避免浮点数精度误差(比如0.1这类循环小数的计算偏差)。
  2. 最大k值推导:由于V1=numk、V2=denk(num/den为最简比值),总和为k*(num+den),通过floor(tot_max/(num+den))得到最大有效正整数k。
  3. 组合生成:基于k的范围批量生成V1、V2,同步计算比值、总和及状态,最终返回结构化数据框。
  4. 边界处理:当tot_max小于num+den时,直接返回空数据框,避免无效计算。

测试结果

运行示例代码会输出:

V1 V2 ratio sum status
1  1  2   0.5   3     OK
2  2  4   0.5   6     OK
3  3  6   0.5   9     OK
4  4  8   0.5  12     OK

内容的提问来源于stack exchange,提问作者neversaint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:05:34