吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 631|回复: 9
收起左侧

[其他求助] 求大佬帮我求一个计算问题

[复制链接]
aixiaodemj 发表于 2024-3-27 20:22
40吾爱币
本帖最后由 aixiaodemj 于 2024-3-27 20:37 编辑

1288,1094.8,966,988,839.8,741,688,584.8,516,388,329.8,291,

这是所有的数字 数字可以被多次调用 最后总和为[26860,26861] 结果可以带小数后两位

不一定要调用所有的数字 取一部分即可

用ai做了半天没搞出来 希望有大佬帮个忙

最佳答案

查看完整内容

我用gpt-4.0给算的。 我先是把你的问题复制粘贴发给它,它回答了一堆思路, 之后我又直接让它给出实现的代码, 它给的代码如下: [mw_shl_code=python,true]# 定义一个简单的函数来尝试找到符合条件的数字组合 def find_combinations(numbers, target_range): from itertools import combinations_with_replacement # 逐步尝试不同的重复次数,从而找到一个接近目标的组合 for r in range(1, 100): # 假设 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xiaobaicai66 发表于 2024-3-27 20:22
我用gpt-4.0给算的。
我先是把你的问题复制粘贴发给它,它回答了一堆思路,
要达到总和在[26860, 26861]范围内,我们可以尝试不同的组合方式,并且可能需要多次使用某些数字。首先,让我们确定一个策略来接近这个问题,考虑到数字可以被重复使用。

策略

选择较大的数字,因为这会帮助我们更快地接近目标总和。
估算重复次数:通过将目标总和除以较大数字的一个近似值,可以得到大致需要重复使用的次数。
细节调整:使用较小的数字来调整总和,以准确达到目标范围。
实施策略

以最大的数字1288为主要选择进行计算:

初步估算:我们可以通过将目标与大数1288进行对比来估算需要重复的次数。例如,26860 / 1288 ≈ 20.85,这意呈现我们需要大约21次的1288来接近下限。

粗略计算:1288 * 21 = 27048,这超过了我们的目标范围,所以我们需要调整策略。

考虑到前面的方法会超出范围,我们可以尝试一个组合方法,结合使用多个数字并重复使用它们来准确达到目标范围。

注意:由于问题的复杂性和需要深入分析的具体数字组合,直接手工计算可能不够实际。这里提供一个简化的思路来逼近解决方案而不是直接的答案:

使用最大数字1288进行基础框架,然后添加其他数值来减少总和,直到落在目标区间内。
选择几个中等大小的数字(例如1094.8,966等)进行重复使用,平衡总和。
最后通过小数字调整,来确保总和落在所需范围内。
示例

如果使用1288大约20次,再结合其他策略进行调整,可以形成一个基础框架。这只是一种思路,具体实施需要根据实际情况来进行数字的选择和次数的调整。

我将演示一个具体的解决方案需要编写代码或使用更高级的数学方法来精确计算。

希望这个策略能为你提供一点思路。如果你有任何具体的需求或者其他问题,欢迎继续提问!


之后我又直接让它给出实现的代码,
它给的代码如下:
[Python] 纯文本查看 复制代码
# 定义一个简单的函数来尝试找到符合条件的数字组合
def find_combinations(numbers, target_range):
    from itertools import combinations_with_replacement
    # 逐步尝试不同的重复次数,从而找到一个接近目标的组合
    for r in range(1, 100): # 假设任何数字最多重复使用100次,这个数字可以根据需要调整
        for combo in combinations_with_replacement(numbers, r):
            if target_range[0] <= sum(combo) <= target_range[1]:
                return combo
    return None

# 定义你的数字列表和目标总和范围
numbers = [1288, 1094.8, 966, 988, 839.8, 741, 688, 584.8, 516, 388, 329.8, 291]
target_range = [26860, 26861]

# 寻找并打印结果
result = find_combinations(numbers, target_range)
if result:
    print("找到一个符合条件的组合:", result)
    print("组合的总和为:", sum(result))
else:
    print("未找到符合条件的组合。")

我在电脑上运行了一会,结果
[Python] 纯文本查看 复制代码
找到一个符合条件的组合: (1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 584.8, 516)
组合的总和为: 26860.8

进程已结束,退出代码0

我用计算器验算了一下还挺对。
hhxk123 发表于 2024-3-27 20:42
写了一个脚本进行暴力计算,稍等一会给你结果
xz152621 发表于 2024-3-27 20:46
给一个笨方法    套用多层for循环,第一层循环,从0开始,到26860/1288结束,然后在for第二层,从0开始,到26860/1094.8结束,然后就这样循环,到最底层,填写if语句,if(26860/1288*i+26860/1094.8*j······)==26860   输出   i,j······的值,能理解我的意思么
llyyz 发表于 2024-3-27 20:48
这个是硬币问题,可以使用动态规划算法。
xz152621 发表于 2024-3-27 20:50
xz152621 发表于 2024-3-27 20:46
给一个笨方法    套用多层for循环,第一层循环,从0开始,到26860/1288结束,然后在for第二层,从0开始,到 ...

这个枚举有点大,可以优化后面几层循环的范围,比如i = 1 的话,那第二层的范围就可以是<26860-i*1288的
qqqwww3366 发表于 2024-3-27 20:54
numbers = [1288, 1094.8, 966, 988, 839.8, 741, 688, 584.8, 516, 388, 329.8, 291]
target_range = [26860, 26861]

def find_combinations(numbers, target):
    results = []
    for r in range(len(numbers) + 1):  # 包含从0到n个元素的所有组合
        for combo in itertools.combinations_with_replacement(numbers, r):
            if sum(combo) in target_range:
                results.append((combo, sum(combo)))
   
    return results

results = find_combinations(numbers, target_range)
for combo, total in results:
    print(f"Combination: {combo}, Total: {total:.2f}")
我的代码,还正在跑
cirke 发表于 2024-3-27 21:01

用Python脚本
import itertools

# 定义数字列表
numbers = [1288, 1094.8, 966, 988, 839.8, 741, 688, 584.8, 516, 388, 329.8, 291]

# 定义目标总和范围
target_min = 26860
target_max = 26861

# 找到所有可能的组合
for i in range(1, len(numbers)+1):
    for combination in itertools.combinations_with_replacement(numbers, i):
        if target_min <= sum(combination) <= target_max:
            print(f"找到一个符合条件的组合: {combination}, 总和为: {sum(combination)}")
            break
hhxk123 发表于 2024-3-27 21:25
我的代码已经跑了40分钟了,还没有出结果
cirke 发表于 2024-3-27 21:41
你也可以试试这个
def closest_sum(numbers, target):
    n = len(numbers)
    closest = [[False] * (target + 1) for _ in range(n + 1)]
    closest[0][0] = True

    for i in range(1, n + 1):
        for j in range(target + 1):
            closest[i][j] = closest[i - 1][j]
            if j >= numbers[i - 1]:
                closest[i][j] = closest[i][j] or closest[i - 1][j - numbers[i - 1]]

    closest_sum = 0
    for j in range(target, -1, -1):
        if closest[n][j]:
            closest_sum = j
            break

    chosen = []
    i, j = n, closest_sum
    while i > 0 and j > 0:
        if not closest[i - 1][j]:
            chosen.append(numbers[i - 1])
            j -= numbers[i - 1]
        i -= 1

    return closest_sum, chosen

# 测试
numbers = [1288, 1094.8, 966, 988, 839.8, 741, 688, 584.8, 516, 388, 329.8, 291]
target = 26860
result = closest_sum(numbers, target)
print("最接近目标值的总和为:", result[0])
print("选择的数字为:", result[1])
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 11:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表