fork download
  1. import itertools
  2.  
  3. # 配置参数
  4. TARGET_VALUE = 28098 # 目标值
  5. BASE_COEFFICIENTS = [38.5, 44, 61, 70.5, 75.5, 93] # 基础系数列表
  6. MAX_PRODUCT = 129000 # 单个系数乘积的严格上限
  7. VARIABLE_RATIO_TOLERANCE = 0.4 # 变量间比例容忍度
  8. COEFFICIENT_GROUPS = [
  9. (70.5, 75.5, 93), # 优先搜索的系数组合(按从小到大排序对应a,b,c)
  10. (61, 70.5, 93),
  11. (61, 75.5, 93),
  12. (61, 70.5, 75.5)
  13. ]
  14.  
  15. def find_similar_solutions():
  16. """寻找与示例解模式相似的解"""
  17. # 搜索优先系数组合(已按从小到大排序)
  18. for coeffs in COEFFICIENT_GROUPS:
  19. solutions = find_three_variable_solutions(coeffs)
  20. if solutions:
  21. print_solutions_group(coeffs, solutions)
  22. return
  23.  
  24. # 扩大搜索范围,所有组合按从小到大排序
  25. for combo in itertools.combinations(BASE_COEFFICIENTS, 3):
  26. coeffs = sorted(combo) # 确保系数按从小到大排序
  27. if coeffs in COEFFICIENT_GROUPS:
  28. continue
  29. solutions = find_three_variable_solutions(coeffs)
  30. if solutions:
  31. print_solutions_group(coeffs, solutions)
  32. return
  33.  
  34. print("未找到符合条件的解")
  35.  
  36. def are_variables_balanced(vars):
  37. """判断变量是否均衡分布"""
  38. if len(vars) != 3:
  39. return False
  40.  
  41. a, b, c = sorted(vars)
  42. ratio1 = a / c
  43. ratio2 = b / c
  44. in_range = all(500 <= v <= 2000 for v in vars)
  45.  
  46. return ratio1 > (1 - VARIABLE_RATIO_TOLERANCE) and \
  47. ratio2 > (1 - VARIABLE_RATIO_TOLERANCE / 2) and \
  48. in_range
  49.  
  50. def find_three_variable_solutions(coeffs):
  51. """寻找三变量解,系数按从小到大排序(a,b,c)"""
  52. a, b, c = coeffs # a:最小系数, b:中间系数, c:最大系数
  53. solutions = []
  54.  
  55. # 计算变量可能的范围
  56. max_x = min(int(MAX_PRODUCT / a), 2000)
  57. max_y = min(int(MAX_PRODUCT / b), 2000)
  58. min_x = max(500, int((TARGET_VALUE * 0.2) / a))
  59. min_y = max(500, int((TARGET_VALUE * 0.2) / b))
  60.  
  61. # 减小步长以找到更多解
  62. step = max(1, (max_x - min_x) // 300)
  63. for x in range(min_x, max_x + 1, step):
  64. ax = a * x
  65. if ax > MAX_PRODUCT:
  66. continue
  67.  
  68. remaining_after_ax = TARGET_VALUE - ax
  69. if remaining_after_ax <= 0:
  70. continue
  71.  
  72. for y in range(min_y, max_y + 1, step):
  73. by = b * y
  74. if by > MAX_PRODUCT:
  75. continue
  76.  
  77. remaining_after_by = remaining_after_ax - by
  78. if remaining_after_by <= 0:
  79. continue
  80.  
  81. # 计算z的值(对应最大系数c)
  82. z = remaining_after_by / c
  83. if not z.is_integer() or not (500 <= z <= 2000):
  84. continue
  85.  
  86. z = int(z)
  87. cz = c * z
  88. if cz > MAX_PRODUCT:
  89. continue
  90.  
  91. # 检查总和
  92. total = ax + by + cz
  93. if abs(total - TARGET_VALUE) > 1:
  94. continue
  95.  
  96. # 检查是否为平衡解
  97. is_balanced = are_variables_balanced([x, y, z])
  98.  
  99. solutions.append((x, y, z, ax, by, cz, total, is_balanced))
  100.  
  101. # 找到4个解后停止
  102. if len(solutions) >= 4:
  103. return solutions
  104.  
  105. return solutions
  106.  
  107. def print_solutions_group(coeffs, solutions):
  108. """按照指定格式打印找到的解组"""
  109. a, b, c = coeffs # a:最小系数, b:中间系数, c:最大系数
  110. print(f"组合: a={a}, b={b}, c={c} ({len(solutions)} 个有效解)")
  111.  
  112. for i, (x, y, z, ax, by, cz, total, is_balanced) in enumerate(solutions, 1):
  113. balance_label = " [平衡解]" if is_balanced else ""
  114.  
  115. # 按照要求的格式分行显示
  116. print(f" {i}. x={x}, y={y}, z={z},")
  117. print(f" a*x={ax}, b*y={by}, c*z={cz}, 总和={total}{balance_label}")
  118.  
  119. if __name__ == "__main__":
  120. find_similar_solutions()
  121.  
Success #stdin #stdout 0.07s 9360KB
stdin
Standard input is empty
stdout
未找到符合条件的解