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

动态规划 - 如何快速找出几个数相加最接近目标数的组合的算法?

冯开诚
2024-10-30

求一个计算几个数相加最接近目标数的组合 的算法。

有一个数组[8477, 7980, 4732, 1337, 714, ...n] 注意:可以反复使用同一个数进行相加,例如8477+8477+1337
数组中的元素相加接近某个目标值的区间:例如 大于17993且小于19051;

要求找出最短组合,就是假设有4个数相加,3个数相加,2个数相加的都满足需求的,那要取2个数相加的组合。

尽可能快的算法,暴力循环,太慢了~

需求javascript版的~

共有1个答案

张敏达
2024-10-30

使用 glpk.js 库来进行整数线性规划
使用javascript
首先,确保你已经安装了 glpk.js:
npm install glpk.js

const glpk = require('glpk.js');

function findMinCombination(nums, lowerBound, upperBound) {
    // 定义目标函数:最小化元素数量
    const c = Array(nums.length).fill(1);

    // 定义不等式约束:和在 lowerBound 和 upperBound 之间
    const A = [
        { vars: nums.map((num, i) => ({ name: `x${i}`, coef: num })), bnds: { type: glpk.GLP_LO, ub: 0, lb: lowerBound } },
        { vars: nums.map((num, i) => ({ name: `x${i}`, coef: num })), bnds: { type: glpk.GLP_UP, ub: upperBound, lb: 0 } }
    ];

    // 定义变量的边界:每个变量都是非负整数
    const bounds = nums.map((_, i) => ({ name: `x${i}`, type: glpk.GLP_LO, ub: Infinity, lb: 0 }));

    // 创建模型
    const lp = {
        name: 'find_min_combination',
        objective: {
            direction: glpk.GLP_MIN,
            name: 'obj',
            vars: nums.map((_, i) => ({ name: `x${i}`, coef: 1 }))
        },
        subjectTo: A,
        bounds: bounds
    };

    // 使用整数线性规划求解
    const result = glpk.solve(lp);

    // 检查是否找到有效解
    if (result.result.status === glpk.GLP_OPT) {
        return Math.floor(result.result.z);
    } else {
        return -1;
    }
}

// 示例用法
const nums = [8477, 7980, 4732, 1337, 714];
const lowerBound = 17993;
const upperBound = 19051;
const result = findMinCombination(nums, lowerBound, upperBound);
console.log(`所需的最小元素数量: ${result}`);

使用 scipy.optimize 库的整数线性规划
使用python

from scipy.optimize import linprog
import numpy as np

def find_min_combination(nums, lower_bound, upper_bound):
    # 定义目标函数:最小化元素数量
    c = np.ones(len(nums))

    # 定义不等式约束:和在 lower_bound 和 upper_bound 之间
    A = np.vstack([nums, -np.array(nums)])
    b = np.array([upper_bound, -lower_bound])

    # 定义变量的边界:每个变量都是非负整数
    bounds = [(0, None) for _ in nums]

    # 使用整数线性规划求解
    res = linprog(c, A_ub=A, b_ub=b, bounds=bounds, method='highs-ipm')

    # 检查是否找到有效解
    if res.success and res.fun != np.inf:
        return int(res.fun)
    else:
        return -1

# 示例用法
nums = [8477, 7980, 4732, 1337, 714]
lower_bound = 17993
upper_bound = 19051
result = find_min_combination(nums, lower_bound, upper_bound)
print(f"所需的最小元素数量: {result}")
 类似资料:
  • 我一直在努力解决教授给我的这个问题,但没有找到合适的解决方案。问题如下 问题:矩形电路板有两个平行的侧面,它们之间的宽度为W。板的上侧有m个端子,n个端子(n (a) 证明在最优解中,任意两条线段都不会相交。 (b) 设计一个O(mn)动态规划算法来解决这个最小化问题。您需要定义子问题,显示归纳公式、初始条件和伪代码。你可以用d(i,j)来表示U[i]和L[j]之间的距离,1≤ 我≤ m、 1个≤

  • 我正在尝试自动查找一个数字与另一个数字的最接近因子; 示例: 700到30的最接近因子是28(30不等于700,但28等于700)。 一个显而易见的解决方案就是得到700的所有因子,并做一个简单的距离计算,找到离30最近的因子,但这似乎是低效的。 另一种解决方案是找到所有基本质因数,例如: 将这些数字相乘得到所有的组合,从而找到最接近的。 我正在尝试对其进行编程,使其自动化。有更好的解决方案吗?

  • 我已经实现了代码来输出从输入数组的元素中获得目标和的所有不同的唯一可能性。例如,给定

  • 我问了这个问题 求和的方法数S与N个数求和的所有方法从给定集合中求和给定数(允许重复) 不太明白那里的答案, 我写了两种方法来解决一个问题: 用数字N(允许重复)找出求和S的方法数 sum=4,number=1,2,3答案是1111、22、1122、31、13、1212、2112、2212 在一种方法中我使用记忆,而在另一种方法中我不使用。不知怎的,在我的机器中,记忆版本的运行速度比非记忆版本慢得

  • 问题内容: 有一条折线,其中折线的顶点列表为[[x1,y1),(x2,y2),(x3,y3),…]和一个点(x,y)。在Shapely中,返回两个几何之间的最短距离。 但是我还需要找到最接近点(x,y)的线上的点的坐标。在上面的示例中,这是距离1.4142135623730951单位的对象上的点的坐标。计算距离时,该方法应具有坐标。有什么方法可以从此方法返回它吗? 问题答案: 您正在描述的GIS术

  • 我应该对两个分区问题的动态规划实现应用什么修改来解决以下任务: 给你一个正整数数组作为输入,表示为C。程序应该决定是否可以将数组划分为两个相等的子序列。您可以从数组中删除一些元素,但不是全部,以使此类分区可行。 例: 假设输入是4 5 11 17 9。如果我们去掉11和17,两个分区是可能的。我问题是,我应该对我的两个分区实现进行什么调整,以确定两个分区是否可能(可能需要或可能不需要删除某些元素)

  • 主要内容:动态规划算法的实际应用动态规划算法解决问题的过程和分治算法类似,也是先将问题拆分成多个简单的小问题,通过逐一解决这些小问题找到整个问题的答案。不同之处在于,分治算法拆分出的小问题之间是相互独立的,而动态规划算法拆分出的小问题之间相互关联,例如要想解决问题 A,必须先解决问题 B 和 C。 《贪心算法》一节中,给大家举过一个例子,假设有 1、7、10 这 3 种面值的纸币,每种纸币使用的数量不限,要求用尽可能少的纸币拼凑

  • 我遇到了以下leetcode问题,我对一些人用来解决它的方法有一个问题。问题是:给定一个非空二叉查找树和一个目标值,在BST中找到最接近目标的k个值。 注意:给定的目标值是浮点。 您可以假设k始终有效,即:k≤总节点。 保证BST中只有一组最接近目标的唯一k值。 所以,有些人所做的是,他们在保持k大小的最近元素队列的同时,按顺序遍历。在顺序遍历过程中,如果发现某个元素比队列中的第一个节点更接近目标