import math
class SumSolver:
def __init__(self):
# 基础配置 - 可根据需要修改
self.target = 219911.73 # 目标总和
self.coefficients = [38.5,44,61,70.5,75.5,93] # 系数列表
self.max_product = 125000 # 单个系数乘积上限
self.fine_tune_index = 0 # 可微调的系数索引(默认第一个)
self.fine_tune_range = 1.0 # 微调范围
self.fine_tune_step = 0.1 # 微调步长
self.max_solutions = 4 # 最大返回解数量
self.balance_threshold = 0.3 # 平衡解判断阈值
self.error_tolerance = 0.1 # 允许的误差范围
def set_parameters(self, **kwargs):
"""灵活设置参数,支持修改任何配置"""
for key, value in kwargs.items():
if hasattr(self, key):
setattr(self, key, value)
else:
print(f"警告: 未知参数 {key}")
return self
def find_solutions(self):
"""寻找符合条件的解"""
# 排序系数,确保一致性
sorted_coeffs = sorted(self.coefficients)
a_base, others = sorted_coeffs[0], sorted_coeffs[1:]
# 尝试原始系数
print(f"尝试原始系数: {sorted_coeffs}")
solutions = self._find_combination(a_base, *others)
if solutions:
self._print_solutions(sorted_coeffs, solutions)
return True
# 尝试微调指定系数
print(f"\n原始系数未找到解,尝试微调第 {self.fine_tune_index+1} 个系数")
start = a_base - self.fine_tune_range
end = a_base + self.fine_tune_range
steps = int((end - start) / self.fine_tune_step) + 1
for i in range(steps):
a = round(start + i * self.fine_tune_step, 1)
if a <= 0:
continue
print(f"尝试系数组合: [{a}, {', '.join(map(str, others))}]")
solutions = self._find_combination(a, *others)
if solutions:
self._print_solutions([a] + others, solutions)
return True
print("\n未找到符合条件的解")
return False
def _find_combination(self, a, b, c):
"""寻找满足 a*x + b*y + c*z ≈ target 的整数解"""
solutions = []
# 计算变量范围
max_x = min(int(self.max_product / a), int(self.target / a) + 100)
max_y = min(int(self.max_product / b), int(self.target / b) + 100)
# 计算步长(确保不遗漏解)
step_x = max(1, max_x // 200)
step_y = max(1, max_y // 200)
# 遍历可能的x和y值
for x in range(1, max_x + 1, step_x):
ax = a * x
if ax > self.max_product:
continue
remaining_after_x = self.target - ax
if remaining_after_x <= 0:
continue
for y in range(1, max_y + 1, step_y):
by = b * y
if by > self.max_product:
continue
remaining_after_y = remaining_after_x - by
if remaining_after_y <= 0:
continue
# 计算z值
z = remaining_after_y / c
if not self._is_near_integer(z):
continue
z = round(z)
cz = c * z
if cz > self.max_product or z <= 0:
continue
# 检查总和是否在允许范围内
total = ax + by + cz
if abs(total
- self.
target) > self.
error_tolerance: continue
# 判断是否为平衡解
is_balanced = self._is_balanced([x, y, z])
solutions.append((x, y, z, ax, by, cz, total, is_balanced))
if len(solutions) >= self.max_solutions:
return solutions
return solutions
def _is_near_integer(self, value):
"""判断一个值是否接近整数"""
return abs(value
- round
(value
)) < 0.001
def _is_balanced(self, variables):
"""判断变量是否相对平衡"""
if len(variables) != 3:
return False
min_var, max_var = min(variables), max(variables)
return (min_var / max_var) > self.balance_threshold if max_var != 0 else False
def _print_solutions(self, coeffs, solutions):
"""打印找到的解"""
labels = ['a', 'b', 'c']
coeff_str = ", ".join([f"{labels[i]}={coeffs[i]}" for i in range(3)])
print(f"找到解! 组合: {coeff_str} ({len(solutions)} 个有效解)")
for i, (x, y, z, ax, by, cz, total, is_balanced) in enumerate(solutions, 1):
balance_label = " [平衡解]" if is_balanced else ""
print(f" {i}. x={x}, y={y}, z={z}, a*x={ax}, b*y={by}, c*z={cz}, 总和={total}{balance_label}")
if __name__ == "__main__":
# 示例用法
solver = SumSolver()
# 根据需要修改参数(示例:求解36.5、68.5、74表示101467.8)
solver.set_parameters(
target=101467.8,
coefficients=[36.5, 68.5, 74],
max_product=50000
)
# 寻找解
solver.find_solutions()
# 如需求解其他组合,直接修改参数即可,例如:
# solver.set_parameters(
# target=28098,
# coefficients=[38.5, 44, 61],
# max_product=30000
# ).find_solutions()
aW1wb3J0IG1hdGgKCmNsYXNzIFN1bVNvbHZlcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjIOWfuuehgOmFjee9riAtIOWPr+agueaNrumcgOimgeS/ruaUuQogICAgICAgIHNlbGYudGFyZ2V0ID0gMjE5OTExLjczICAgICAgICMg55uu5qCH5oC75ZKMCiAgICAgICAgc2VsZi5jb2VmZmljaWVudHMgPSBbMzguNSw0NCw2MSw3MC41LDc1LjUsOTNdICAjIOezu+aVsOWIl+ihqAogICAgICAgIHNlbGYubWF4X3Byb2R1Y3QgPSAxMjUwMDAgICAgICAjIOWNleS4quezu+aVsOS5mOenr+S4iumZkAogICAgICAgIHNlbGYuZmluZV90dW5lX2luZGV4ID0gMCAgICAgICMg5Y+v5b6u6LCD55qE57O75pWw57Si5byV77yI6buY6K6k56ys5LiA5Liq77yJCiAgICAgICAgc2VsZi5maW5lX3R1bmVfcmFuZ2UgPSAxLjAgICAgIyDlvq7osIPojIPlm7QKICAgICAgICBzZWxmLmZpbmVfdHVuZV9zdGVwID0gMC4xICAgICAjIOW+ruiwg+atpemVvwogICAgICAgIHNlbGYubWF4X3NvbHV0aW9ucyA9IDQgICAgICAgICMg5pyA5aSn6L+U5Zue6Kej5pWw6YePCiAgICAgICAgc2VsZi5iYWxhbmNlX3RocmVzaG9sZCA9IDAuMyAgIyDlubPooaHop6PliKTmlq3pmIjlgLwKICAgICAgICBzZWxmLmVycm9yX3RvbGVyYW5jZSA9IDAuMSAgICAjIOWFgeiuuOeahOivr+W3ruiMg+WbtAoKICAgIGRlZiBzZXRfcGFyYW1ldGVycyhzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgIiIi54G15rS76K6+572u5Y+C5pWw77yM5pSv5oyB5L+u5pS55Lu75L2V6YWN572uIiIiCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4ga3dhcmdzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwga2V5KToKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5LCB2YWx1ZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50KGYi6K2m5ZGKOiDmnKrnn6Xlj4LmlbAge2tleX0iKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGZpbmRfc29sdXRpb25zKHNlbGYpOgogICAgICAgICIiIuWvu+aJvuespuWQiOadoeS7tueahOinoyIiIgogICAgICAgICMg5o6S5bqP57O75pWw77yM56Gu5L+d5LiA6Ie05oCnCiAgICAgICAgc29ydGVkX2NvZWZmcyA9IHNvcnRlZChzZWxmLmNvZWZmaWNpZW50cykKICAgICAgICBhX2Jhc2UsIG90aGVycyA9IHNvcnRlZF9jb2VmZnNbMF0sIHNvcnRlZF9jb2VmZnNbMTpdCiAgICAgICAgCiAgICAgICAgIyDlsJ3or5Xljp/lp4vns7vmlbAKICAgICAgICBwcmludChmIuWwneivleWOn+Wni+ezu+aVsDoge3NvcnRlZF9jb2VmZnN9IikKICAgICAgICBzb2x1dGlvbnMgPSBzZWxmLl9maW5kX2NvbWJpbmF0aW9uKGFfYmFzZSwgKm90aGVycykKICAgICAgICBpZiBzb2x1dGlvbnM6CiAgICAgICAgICAgIHNlbGYuX3ByaW50X3NvbHV0aW9ucyhzb3J0ZWRfY29lZmZzLCBzb2x1dGlvbnMpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgCiAgICAgICAgIyDlsJ3or5Xlvq7osIPmjIflrprns7vmlbAKICAgICAgICBwcmludChmIlxu5Y6f5aeL57O75pWw5pyq5om+5Yiw6Kej77yM5bCd6K+V5b6u6LCD56ysIHtzZWxmLmZpbmVfdHVuZV9pbmRleCsxfSDkuKrns7vmlbAiKQogICAgICAgIHN0YXJ0ID0gYV9iYXNlIC0gc2VsZi5maW5lX3R1bmVfcmFuZ2UKICAgICAgICBlbmQgPSBhX2Jhc2UgKyBzZWxmLmZpbmVfdHVuZV9yYW5nZQogICAgICAgIHN0ZXBzID0gaW50KChlbmQgLSBzdGFydCkgLyBzZWxmLmZpbmVfdHVuZV9zdGVwKSArIDEKICAgICAgICAKICAgICAgICBmb3IgaSBpbiByYW5nZShzdGVwcyk6CiAgICAgICAgICAgIGEgPSByb3VuZChzdGFydCArIGkgKiBzZWxmLmZpbmVfdHVuZV9zdGVwLCAxKQogICAgICAgICAgICBpZiBhIDw9IDA6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50KGYi5bCd6K+V57O75pWw57uE5ZCIOiBbe2F9LCB7JywgJy5qb2luKG1hcChzdHIsIG90aGVycykpfV0iKQogICAgICAgICAgICBzb2x1dGlvbnMgPSBzZWxmLl9maW5kX2NvbWJpbmF0aW9uKGEsICpvdGhlcnMpCiAgICAgICAgICAgIGlmIHNvbHV0aW9uczoKICAgICAgICAgICAgICAgIHNlbGYuX3ByaW50X3NvbHV0aW9ucyhbYV0gKyBvdGhlcnMsIHNvbHV0aW9ucykKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgCiAgICAgICAgcHJpbnQoIlxu5pyq5om+5Yiw56ym5ZCI5p2h5Lu255qE6KejIikKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX2ZpbmRfY29tYmluYXRpb24oc2VsZiwgYSwgYiwgYyk6CiAgICAgICAgIiIi5a+75om+5ruh6LazIGEqeCArIGIqeSArIGMqeiDiiYggdGFyZ2V0IOeahOaVtOaVsOinoyIiIgogICAgICAgIHNvbHV0aW9ucyA9IFtdCiAgICAgICAgCiAgICAgICAgIyDorqHnrpflj5jph4/ojIPlm7QKICAgICAgICBtYXhfeCA9IG1pbihpbnQoc2VsZi5tYXhfcHJvZHVjdCAvIGEpLCBpbnQoc2VsZi50YXJnZXQgLyBhKSArIDEwMCkKICAgICAgICBtYXhfeSA9IG1pbihpbnQoc2VsZi5tYXhfcHJvZHVjdCAvIGIpLCBpbnQoc2VsZi50YXJnZXQgLyBiKSArIDEwMCkKICAgICAgICAKICAgICAgICAjIOiuoeeul+atpemVv++8iOehruS/neS4jemBl+a8j+ino++8iQogICAgICAgIHN0ZXBfeCA9IG1heCgxLCBtYXhfeCAvLyAyMDApCiAgICAgICAgc3RlcF95ID0gbWF4KDEsIG1heF95IC8vIDIwMCkKICAgICAgICAKICAgICAgICAjIOmBjeWOhuWPr+iDveeahHjlkox55YC8CiAgICAgICAgZm9yIHggaW4gcmFuZ2UoMSwgbWF4X3ggKyAxLCBzdGVwX3gpOgogICAgICAgICAgICBheCA9IGEgKiB4CiAgICAgICAgICAgIGlmIGF4ID4gc2VsZi5tYXhfcHJvZHVjdDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgcmVtYWluaW5nX2FmdGVyX3ggPSBzZWxmLnRhcmdldCAtIGF4CiAgICAgICAgICAgIGlmIHJlbWFpbmluZ19hZnRlcl94IDw9IDA6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciB5IGluIHJhbmdlKDEsIG1heF95ICsgMSwgc3RlcF95KToKICAgICAgICAgICAgICAgIGJ5ID0gYiAqIHkKICAgICAgICAgICAgICAgIGlmIGJ5ID4gc2VsZi5tYXhfcHJvZHVjdDoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcmVtYWluaW5nX2FmdGVyX3kgPSByZW1haW5pbmdfYWZ0ZXJfeCAtIGJ5CiAgICAgICAgICAgICAgICBpZiByZW1haW5pbmdfYWZ0ZXJfeSA8PSAwOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAjIOiuoeeul3rlgLwKICAgICAgICAgICAgICAgIHogPSByZW1haW5pbmdfYWZ0ZXJfeSAvIGMKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9pc19uZWFyX2ludGVnZXIoeik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHogPSByb3VuZCh6KQogICAgICAgICAgICAgICAgY3ogPSBjICogegogICAgICAgICAgICAgICAgaWYgY3ogPiBzZWxmLm1heF9wcm9kdWN0IG9yIHogPD0gMDoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIyDmo4Dmn6XmgLvlkozmmK/lkKblnKjlhYHorrjojIPlm7TlhoUKICAgICAgICAgICAgICAgIHRvdGFsID0gYXggKyBieSArIGN6CiAgICAgICAgICAgICAgICBpZiBhYnModG90YWwgLSBzZWxmLnRhcmdldCkgPiBzZWxmLmVycm9yX3RvbGVyYW5jZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIyDliKTmlq3mmK/lkKbkuLrlubPooaHop6MKICAgICAgICAgICAgICAgIGlzX2JhbGFuY2VkID0gc2VsZi5faXNfYmFsYW5jZWQoW3gsIHksIHpdKQogICAgICAgICAgICAgICAgc29sdXRpb25zLmFwcGVuZCgoeCwgeSwgeiwgYXgsIGJ5LCBjeiwgdG90YWwsIGlzX2JhbGFuY2VkKSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgbGVuKHNvbHV0aW9ucykgPj0gc2VsZi5tYXhfc29sdXRpb25zOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2x1dGlvbnMKICAgICAgICAKICAgICAgICByZXR1cm4gc29sdXRpb25zCgogICAgZGVmIF9pc19uZWFyX2ludGVnZXIoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIuWIpOaWreS4gOS4quWAvOaYr+WQpuaOpei/keaVtOaVsCIiIgogICAgICAgIHJldHVybiBhYnModmFsdWUgLSByb3VuZCh2YWx1ZSkpIDwgMC4wMDEKCiAgICBkZWYgX2lzX2JhbGFuY2VkKHNlbGYsIHZhcmlhYmxlcyk6CiAgICAgICAgIiIi5Yik5pat5Y+Y6YeP5piv5ZCm55u45a+55bmz6KGhIiIiCiAgICAgICAgaWYgbGVuKHZhcmlhYmxlcykgIT0gMzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIAogICAgICAgIG1pbl92YXIsIG1heF92YXIgPSBtaW4odmFyaWFibGVzKSwgbWF4KHZhcmlhYmxlcykKICAgICAgICByZXR1cm4gKG1pbl92YXIgLyBtYXhfdmFyKSA+IHNlbGYuYmFsYW5jZV90aHJlc2hvbGQgaWYgbWF4X3ZhciAhPSAwIGVsc2UgRmFsc2UKCiAgICBkZWYgX3ByaW50X3NvbHV0aW9ucyhzZWxmLCBjb2VmZnMsIHNvbHV0aW9ucyk6CiAgICAgICAgIiIi5omT5Y2w5om+5Yiw55qE6KejIiIiCiAgICAgICAgbGFiZWxzID0gWydhJywgJ2InLCAnYyddCiAgICAgICAgY29lZmZfc3RyID0gIiwgIi5qb2luKFtmIntsYWJlbHNbaV19PXtjb2VmZnNbaV19IiBmb3IgaSBpbiByYW5nZSgzKV0pCiAgICAgICAgcHJpbnQoZiLmib7liLDop6MhIOe7hOWQiDoge2NvZWZmX3N0cn0gKHtsZW4oc29sdXRpb25zKX0g5Liq5pyJ5pWI6KejKSIpCiAgICAgICAgCiAgICAgICAgZm9yIGksICh4LCB5LCB6LCBheCwgYnksIGN6LCB0b3RhbCwgaXNfYmFsYW5jZWQpIGluIGVudW1lcmF0ZShzb2x1dGlvbnMsIDEpOgogICAgICAgICAgICBiYWxhbmNlX2xhYmVsID0gIiBb5bmz6KGh6KejXSIgaWYgaXNfYmFsYW5jZWQgZWxzZSAiIgogICAgICAgICAgICBwcmludChmIiAge2l9LiB4PXt4fSwgeT17eX0sIHo9e3p9LCBhKng9e2F4fSwgYip5PXtieX0sIGMqej17Y3p9LCDmgLvlkow9e3RvdGFsfXtiYWxhbmNlX2xhYmVsfSIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyDnpLrkvovnlKjms5UKICAgIHNvbHZlciA9IFN1bVNvbHZlcigpCiAgICAKICAgICMg5qC55o2u6ZyA6KaB5L+u5pS55Y+C5pWw77yI56S65L6L77ya5rGC6KejMzYuNeOAgTY4LjXjgIE3NOihqOekujEwMTQ2Ny4477yJCiAgICBzb2x2ZXIuc2V0X3BhcmFtZXRlcnMoCiAgICAgICAgdGFyZ2V0PTEwMTQ2Ny44LAogICAgICAgIGNvZWZmaWNpZW50cz1bMzYuNSwgNjguNSwgNzRdLAogICAgICAgIG1heF9wcm9kdWN0PTUwMDAwCiAgICApCiAgICAKICAgICMg5a+75om+6KejCiAgICBzb2x2ZXIuZmluZF9zb2x1dGlvbnMoKQogICAgCiAgICAjIOWmgumcgOaxguino+WFtuS7lue7hOWQiO+8jOebtOaOpeS/ruaUueWPguaVsOWNs+WPr++8jOS+i+Wmgu+8mgogICAgIyBzb2x2ZXIuc2V0X3BhcmFtZXRlcnMoCiAgICAjICAgICB0YXJnZXQ9MjgwOTgsCiAgICAjICAgICBjb2VmZmljaWVudHM9WzM4LjUsIDQ0LCA2MV0sCiAgICAjICAgICBtYXhfcHJvZHVjdD0zMDAwMAogICAgIyApLmZpbmRfc29sdXRpb25zKCkKICAgIA==