数组中所有数字求和 求数组中所有数字的组合
本文旨在提供一种给定商品价格储备和目标金额的解决方案,找出所有价格组合等于目标金额的方案。通过递归算法,可以有效地找到所有可能的组合,将其存储放在一个列表中。本文将详细介绍介绍该算法的实现,并提供Java代码示例,帮助读者理解和应用该方法。该算法原理
该算法问题的核心定位找到阵列中若干个元素的组合,使得这些元素的和相等给定的目标值。一种常用的解决思路是使用递归递归的思路如下:基本情况:如果当前每个组合的和相等目标值,则将组合添加到结果列表中。如果当前组合的和大于或等于目标值,则停止递归。递归步骤:遍历队列中的每个元素。对于元素,将其添加到当前组合中,并电梯调用自身,同时更新剩余的队列和目标值。在电梯调用返回后,将元素从当前组合中移除,以便尝试其他可能的组合。Java代码实现
以下是使用Java实现该算法的代码示例:import java.util.ArrayList;导入java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class CombinationSum { /** * 查找吞吐量中所有和相同目标值的组合。 * * @param listToReturn 存储结果的列表。 * @paramnumbers 包含所有价格的吞吐量。 * @paramtarget 目标金额。 * @paramallowDuplicatesInList 是否允许重复组合。
*/ public static void combinationsEqualTarget(Listlt;Stringgt; listToReturn, int[] numbers, int target, boolean... allowDuplicatesInList) { boolean allowDuplicates = true; //默认允许重复组合 if (allowDuplicatesInList.length gt; 0) { allowDuplicates = allowDuplicatesInList[0]; } sumToTargetValue(listToReturn, new ArrayListlt;gt;(Arrays.stream(numbers).boxed().collect( Collectors.toList())), target, new ArrayListlt;gt;()); if (!allowDuplicates) { for (int i = 0; i lt; listToReturn.size(); i ) { for (int j = i 1; j lt; listToReturn.size(); j ) { if (listToReturn.get(i).equals(listToReturn.get(j))) { listToReturn.remove(j); j--; } } } } } /** * 递归函数,用于查找组合。 * * @param listToReturn 存储结果的列表。 * @param number 剩余的数字列表。 * @param target 剩余的目标值。 * @param temp 当前的组合。
*/ private static void sumToTargetValue(Listlt;Stringgt; listToReturn, Listlt;Integergt; numbers, int target, Listlt;Integergt; temp) { int sum = 0; for (int x : temp) { sum = x; } if (sum == target) { listToReturn.add(temp.toString().replace(quot;[quot;, quot;quot;).replace(quot;]quot;, quot;quot;)); return; } if (sum gt;= target) { return; } for (int i = 0; i lt; numbers.size(); i ) { Listlt;Integergt; remaining = new ArrayListlt;gt;(); int n = numbers.get(i); for (int j = i 1; j lt; numbers.size(); j ) { remaining.add(numbers.get(j)); } Listlt;Integergt; tempRec = new ArrayListlt;gt;(temp); tempRec.add(n); sumToTargetValue(listToReturn,剩余,目标,tempRec); } } public static void main(String[] args) { int[] rates = {10, 15, 3, 4, 80, 110, 90, 92, 7, 5, 3, 7, 2}; int MoneyToSpend = 100;Listlt;Stringgt;list = new ArrayListlt;gt;();combinationsEqualTarget(list,prices,moneyToSpend);for(String items:list){System.out.println(items);} }}登录后复制代码解释combinationsEqualTarget():该函数是入口函数,接收价格队列数、目标金额target和一个可选参数allowDuplicatesInList,用于指定是否允许结果列表中存在重复的组合。
sumToTargetValue():该函数是一个函数,用于查找所有可能的组合。它接收一个结果列表listToReturn、剩余的数字列表数字、剩余的目标值target和当前的组合temp。main():该函数用于测试代码。它创建了一个价格储备和一个目标金额,然后调用combinatio nsEqualTarget()函数查找所有可能的组合,将结果打印到控制台。使用示例
在main()函数中,我们定义了一个价格仓库prices和一个目标金额moneyToSpend。然后,我们创建一个空列表列表,并调用combinationsEqualTarget()函数查找所有可能的组合最后,我们将结果打印到控制台。注意事项该算法的时间复杂度更高,因为需要遍历所有可能的组合。如果价格储备中包含大量的元素,则该算法可能会非常慢。可以对该算法进行优化,例如使用动态规划。总结
论文介绍了一种使用梯度算法解决给定商品价格和目标金额,求出所有价格组合等于目标金额的方案该算法可以有效地找到所有可能的组合,把其存储在一个列表中。本文提供了Java代码示例,帮助读者理解和应用该方法。虽然该算法的时间复杂度相当,但在实际应用中,通过优化来提高性能。
以上就是临时调度中组合相当于目标金额的所有可能组合的详细内容,更多请关注乐哥常识网其他文章相关!