C#非递归实现可变列数上下值所有组合求和的方法
实现思路
每列仅存在2种取值选择,总组合数为2^n(n为列数),直接通过位运算遍历所有组合即可,无需递归:
- 遍历范围为0到
(1 << n) - 1的整数,整数的每一位对应一列的取值选择 - 某一位取值为0时取对应列的下限,为1时取对应列的上限
- 累加当前组合的所有取值,即可得到对应组合的求和结果
C# 实现代码
using System; using System.Collections.Generic; public static class CombinationSumCalc { // 入参为每列的上下限集合,返回所有组合的求和结果 public static List<int> GetAllCombinationSums(List<(int ValueInf, int ValueSup)> columns) { var results = new List<int>(); int combinationCount = 1 << columns.Count; // 等价于2的列数次方 for (int mask = 0; mask < combinationCount; mask++) { int currentSum = 0; for (int colIndex = 0; colIndex < columns.Count; colIndex++) { // 根据当前位的标识选择取上下限 currentSum += (mask & (1 << colIndex)) != 0 ? columns[colIndex].ValueSup : columns[colIndex].ValueInf; } results.Add(currentSum); } return results; } // 示例运行入口 public static void Main() { var testColumns = new List<(int, int)> { (5, 10), (6, 20), (7, 30) }; var allSums = GetAllCombinationSums(testColumns); allSums.ForEach(sum => Console.WriteLine(sum)); } }
示例输出
运行测试用例得到的8个结果依次为:18、41、32、55、23、46、37、60,和你列出的所有组合求和结果完全匹配。
内容的提问来源于stack exchange,提问作者Newbie_thefirst
相关产品推荐
相关产品推荐

