Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从给定的数字中找到一个序列,该序列的总和是给定值?

从给定的数字中找到一个序列,该序列的总和是给定值?
EN

Stack Overflow用户
提问于 2013-10-29 18:08:58
回答 2查看 1.1K关注 0票数 3

给定一组整数(正数或负数),如何找到这些数字的和为给定值的序列?

示例:给定一个数字列表[4,-16, 9, 33],我需要求和17。我可以选择sequence [4, 4, 9](数字可以重用)或[-16, 33]。我正在尝试找到一种有效的方法来减少序列的长度。

它类似于Subset Sum Problem (http://en.wikipedia.org/wiki/Subset_sum),但在我的例子中,数字可以重用。

这也有点像分区问题(Find all possible subsets that sum up to a given number),但在我的例子中有负值。

我目前的贪婪算法如下。在每个循环中,我将尝试找到一个使当前和与目标和之间的差值最小化的数字。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
integers = [-2298478782, 1527301251, 4, 4078748803, 3388759435,
        1583071281, 2214591602, 1528349827, -12, 59460983,
        -939524100, -1, 2315255807]
target_sum = 1997393191

difference = target_sum
chain = list()
while difference != 0:
    min_abs_difference = abs(difference)
    next_int = 0
    found = False
    for i in integers:
        new_abs_diff = abs(i+difference)
        if new_abs_diff < min_abs_difference:
            found = True
            next_int = i
            min_abs_difference = new_abs_diff
    if not found:
        print(difference)
        print(chain)
        print("Cannot find an integer that makes difference smaller")
        break
    difference += next_int
    chain.append(next_int)
print(chain)
EN

回答 2

Stack Overflow用户

发布于 2013-10-29 18:18:11

很可能没有一个快速的算法可以给出一个最优的解决方案。子集求和问题是NP完全的,这个问题比你的问题容易(因为你允许重复使用数字)。

考虑到这个问题是NP完全的,我认为您应该专注于改进当前的算法,或者用更快的语言(如C )重写它,然后您就可以从Python中调用C代码了。

票数 1
EN

Stack Overflow用户

发布于 2013-10-29 18:25:24

因为它显然至少是NP完全问题,所以你可以把它描述成一个混合整数线性规划问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Minimize summation( Xi ) // Xi = number of times the array element Ai is used.
Subject To
     summation( Ai*Xi ) = S.
     Xi >= 0 { Xi are all integers }

您可以使用任何求解器来求解它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19665962

复制
相关文章
Java 给定字符串中找到数字
public myTest{ public static StringBuilder hhhh(String value) { StringBuilder sb = new StringBuilder(); String strIndex = ""; // String regex = "\\d*"; 可以用String 但最终结果只有后面的数字 例子中的只能显示222222222,因为会被替代 Pattern pattern = Pa
桑鱼
2020/04/24
3830
Java 给定字符串中找到数字
Python寻找给定序列中相差最小的两个数字
import random def getTwoClosestElements(seq): #先进行排序,使得相邻元素最接近 #相差最小的元素必然相邻 seq = sorted(seq) #无穷大 dif = float('inf') #遍历所有元素,两两比较,比较相邻元素的差值 #使用选择法寻找相差最小的两个元素 for i,v in enumerate(seq[:-1]): d = abs(v - seq[i+1]) if d < dif:
Python小屋屋主
2018/04/17
2.2K0
给定入栈序列,判断出栈序列是否合法
题目:分别给定入栈序列和出栈序列,然后判断出栈序列是否合法。如入栈序列是[1,3,2,4,5],出栈序列[3,1,2,4,5]是合法的,[3,1,5,2,4]是不合法的。
恋喵大鲤鱼
2018/08/03
1.7K0
LeetCode 1430. 判断给定的序列是否是二叉树从根到叶的路径(递归)
给定一个二叉树,我们称从根节点到任意叶节点的任意路径中的节点值所构成的序列为该二叉树的一个 “有效序列” 。 检查一个给定的序列是否是给定二叉树的一个 “有效序列” 。
Michael阿明
2020/07/13
8600
LeetCode 1430. 判断给定的序列是否是二叉树从根到叶的路径(递归)
计算给定多项式在给定点X处的值
//计算多项式求值 解答:多项式系数可以用数组来存储; POW 函数 原型:在TC2.0中原型为extern float pow(float x, float y); , 而在VC6.0中原型为double pow( double x, double y ); 头文件:math.h/cmath(C++中) 功能:计算x的y次幂。 返回值:x不能为负数且y为小数,或者x为0且y小于等于0,返回幂指数的结果。 返回类型:double型,int,float会给与警告! //计算多项式求值 f(x,n)=x-x^2
互联网金融打杂
2018/04/03
8680
2022-06-16:给定一个数组arr,含有n个数字,都是非负数,给定一个正数k,返回所有子序列中,累加和最小的前k个子序列累
[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_04_1_week/Code06_TopMinSubsquenceSum.java)
福大大架构师每日一题
2023/06/08
2630
2022-06-16:给定一个数组arr,含有n个数字,都是非负数,给定一个正数k,返回所有子序列中,累加和最小的前k个子序列累
2021-11-16:最长递增子序列的个数。给定一个未排序的整
2021-11-16:最长递增子序列的个数。给定一个未排序的整数数组,找到最长递增子序列的个数。注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。力扣673。
福大大架构师每日一题
2021/11/16
2290
2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在
2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,
福大大架构师每日一题
2023/10/23
2020
2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最快? 来自亚马逊。 答案2022-06-
福大大架构师每日一题
2022/06/16
5100
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最
php数组中模糊查询给定的值
第一种:查询给定的值索引不变 /** * 在数组中模糊搜索给定的值 * @param $data * @param $keyword * @return array */ function searchArr($data,$keyword){ $arr = array(); foreach($data as $key=>$values ){ if (strstr( $values , $keyword ) !== false ){ $arr
素描
2019/09/19
6.4K0
LeetCode 2115. 从给定原材料中找到所有可以做出的菜(拓扑排序)
你有 n 道不同菜的信息。给你一个字符串数组 recipes 和一个二维字符串数组 ingredients 。 第 i 道菜的名字为 recipes[i] ,如果你有它 所有 的原材料 ingredients[i] ,那么你可以 做出 这道菜。一道菜的原材料可能是 另一道 菜,也就是说 ingredients[i] 可能包含 recipes 中另一个字符串。
Michael阿明
2022/01/07
2780
学位等级——给定度数序列的随机图包含绘制度等级图和图形。
import networkx as nx import matplotlib.pyplot as plt G = nx.gnp_random_graph(100, 0.02) degree_sequence = sorted([d for n, d in G.degree()], reverse=True) # print "Degree sequence", degree_sequence dmax = max(degree_sequence) plt.loglog(degree_sequenc
裴来凡
2022/05/28
2840
学位等级——给定度数序列的随机图包含绘制度等级图和图形。
【数字信号处理】周期序列 ( 周期序列示例 3 | 判断序列是否是周期序列 )
文章目录 一、周期序列示例 3 ( 判断序列是否是周期序列 ) 一、周期序列示例 3 ( 判断序列是否是周期序列 ) ---- 给定周期序列 : \widetilde x(n) = \sin( n ) 有 2 个条件是已知条件 : ① 正弦函数周期 : \sin 正弦函数 的周期是 2\pi ; sin (\phi) = sin(\phi + 2k\pi) 代入到周期序列中 : \widetilde x(n) = sin ( n ) = sin( n + 2k\pi) ② 周期序列特性 : 上述
韩曙亮
2023/03/30
9790
2021-08-04:给定一个字符串str,当然可以生成很多子序列。返回有多少个子序列是回文子序列,空序列不算回文。比如,str
2021-08-04:给定一个字符串str,当然可以生成很多子序列。返回有多少个子序列是回文子序列,空序列不算回文。比如,str = “aba”,回文子序列:{a}、{a}、 {a,a}、 {b}、{a,b,a},返回5。
福大大架构师每日一题
2021/08/06
3040
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大,怎么算最快? 来自Amazon。 答案
福大大架构师每日一题
2022/06/17
5200
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大
geotools获取给定点的DEM高程值
1、在web端绘制一条曲线; 2、获取各节点处的高程值; 3、根据高程值绘制高程堆积图。
牛老师讲GIS
2018/10/23
1.4K0
geotools获取给定点的DEM高程值
2022-04-17:给定一个数组arr,其中的值有可能正、负、0,给定一个正数k。
[左神java代码](https://github.com/algorithmzuo/blob/main/src/class_2022_01_3_week/Code03_ShortestSubarrayWithSumAtLeastK.java)
福大大架构师每日一题
2022/06/04
3900
2022-04-17:给定一个数组arr,其中的值有可能正、负、0,给定一个正数k。
Java实现给定一个无序的整数数组,找到其中最长上升子序列的长度。
1 首先开辟一个新数组 ,长度等于nums //用来存储没一个值得最大上升子序列数目
CaesarChang张旭
2021/01/26
9110
Java实现给定一个无序的整数数组,找到其中最长上升子序列的长度。
给定一个罗马数字,将其转换成整数_计算并输出给定整数n的所有因子
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。 但也存在特例,例如 4 不写做 IIII,而是 IV。 数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。 同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
全栈程序员站长
2022/11/10
4790
算法--二分查找--查找给定条件的值
例如:4,5,6,7,1,2,3 循环数组性质:以数组中间点为分区,数组分成一个有序数组和一个循环有序数组。
Michael阿明
2021/02/20
1.2K0
算法--二分查找--查找给定条件的值

相似问题

如何从一个列表中找到数字,结果是基于给定数字的序列?

23

如何在excel中找到给定数字的最大序列?

12

从给定的字符串中找到给定长度的子序列?

24

给定数字的总和

226

序列给出了已经给定的数字

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文