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

如何找到求和到给定值可能集合

魏松
2023-03-14

给定一个arraylist和一个值,找出array中是否有一个和等于给定值的三元组。使用set找到了解决方案

我只想知道,如果我们不想找到三重,而是任何可能的数字,单重,双重,三重,四重奏,五重,六重,七重,会有什么逻辑。在本例中b表示

        long n = 12;
        long k = 8;
        int b = 3;

        List<Long> sticksOrder = new ArrayList<>();
        for (long l = 1; l <= k; l++){
            sticksOrder.add(l);
        }

        for (int i = 0; i < sticksOrder.size() - 2; i++) {
            Set<Long> s = new HashSet<>();
            long curr_sum = n - sticksOrder.get(i);
            for (int j = i + 1; j < sticksOrder.size(); j++)
            {
                if (s.contains(curr_sum - sticksOrder.get(j)))
                {
                    System.out.printf("Triplet is %d, %d, %d", sticksOrder.get(i), sticksOrder.get(j), curr_sum - sticksOrder.get(j));
                }
                s.add(sticksOrder.get(j));
            }
        }

共有1个答案

宓博实
2023-03-14

你所描述的更广为人知的是背包问题。

它是NP完全的。意思是,如果你有一个高效的算法,那么两件事将会发生:

[1]有一大堆算法,比如旅行推销员,我可以这样写:“转换输入,使其成为一个背包问题,使用初学者惊人高效的背包问题求解器,现在我已经转换输入,使其看起来像一个背包问题,它可以快速解决我的问题,然后将我得到的答案转换回旅行推销员问题的答案;转换也可以是高效的,使整个管道变得高效”。换句话说,解决一个NP完全问题,然后全部解决;这就是np-complete的完整部分的含义(它包含所有NP域)。

这也意味着,如果你认为你有一个有效的方法来做这件事,或者如果你认为你可以采取一个有效的算法,并通过一些调整,你认为你可以把它变成一个保留其效率并可以解决背包问题的算法,那么要么[a]十亿美元,要么[B]不。

可能是[B]。

你粘贴的这个算法是高效的。因此,不能轻易地调整它来做你想做的事情--这种调整要么是如此不明显,以至于许多人都没有发现它,要么将算法转换成完全不同的东西(因为它必须是一个不太高效的算法)。

 类似资料:
  • 给定一组整数(正数或负数),我怎样才能找到一个和给定值相加的数字序列? 示例:给定一个数字列表,我需要求和。我可以选择序列(数字可以重复使用)或。我正试图找到一种有效的方法来缩短序列的长度。 这就像(http://en.wikipedia.org/wiki/Subset_sum)但就我而言,数字可以重复使用。 这也有点像分区问题(找到所有可能的子集,求和到一个给定的数字),但在我的例子中有负值。

  • 给定一个2d数组,我需要返回一个具有路径的矩阵,该路径递归地求和到给定的数字。 路径矩阵应为零,但总计为给定数字的路径除外,该路径将标记为1。 路径只能在 我尝试过所有的可能性,首先检查我是否已经去过下一个街区。 问题是在一些迭代之后,它会停止,并且不会返回并再次将块清除为0。 给定 在通话中 我以为算法会回来 我得到 相反 调用paintPath(mat1400,path,0,0);我想 或 问

  • SO有很多关于子集和的问题和答案,但不知怎么的,我找不到解决我具体问题的方法。 我需要找到轨道段的数量和长度,以构建长度为n的轨道。轨道段的长度为:8、10、12、14、16、18、20、22、24英尺。数量最多可为4个轨道段。轨道长度在20到100英尺之间(且始终为偶数) 这是一条真正的赛道。分段的顺序并不重要。但是,也有首选的尺寸组合。与大/小组合相比,所有长度相等或彼此接近的组合都是首选。

  • 问题内容: 我想查找给定月份中的所有星期六和星期日。我该怎么办? 问题答案: 在 最简单 的方法是只迭代所有在一个月的日子里,检查一周的某一天为他们每个人。例如: 我 绝对可以确定 ,这样做的方式要高效得多-但这就是我的出发点,当发现速度太慢时进行优化。 请注意,如果您能够使用Joda Time,那将使您的生活更加轻松…

  • 问题内容: 给定一个类名作为字符串,如何在运行时获取它的包名?我没有带有包名+类名的完全限定名称。仅是类名。 我想在方法中使用包名。 找到第一个匹配的软件包名称(如果多个软件包具有相同的类),就可以了。 有任何想法吗? 更新 我没有要处理的Class实例。我的要求是使用该方法创建一个Class 。但是我只是将类名作为字符串。我需要某种方法来遍历软件包并确定我所拥有的类是否属于该软件包。 异常的堆栈

  • 我有这样一个数组: 1,2,3,4,5。 我想找出每一个可能的三元组的总和,比如:123、124、125、134、135等等 我曾尝试使用3个while循环和3个变量(I,j,k)迭代每个三元组,但时间复杂度是O(n^3),我希望是O(n^2)。 希望有人来帮忙。

  • 我想写一个R脚本,它将生成一个集合数的所有可能组合,其乘积总和低于某个总数。 例如,我有这两个向量,

  • 问题内容: 我想知道Java数组中是否有本机方法来获取给定值的表索引? 假设我的表格包含以下字符串: 假设用户必须输入汽车的类型,然后在后台程序将使用该字符串并获取其在数组中的位置。 因此,如果该人进入:轿车它应该处于位置0并将其存储在由我的程序创建的Cars对象中… 问题答案: 这之后是您的汽车的数组索引,如果不存在则为-1。