从列表中获取总和为值的元素数组[重复]

     2023-04-13     286

关键词:

【中文标题】从列表中获取总和为值的元素数组[重复]【英文标题】:Get array of elements from list that sum to value [duplicate] 【发布时间】:2021-11-20 01:02:50 【问题描述】:

下面是我的问题的简化版本,下面的背景摘要提供了更大的背景。

问题:

创建一个函数,列出列表中所有元素的总和为数组中的给定值。

鉴于:

List<int> list = new List<int>()  1, 2, 3, 4, 5, 9 ;

如果提供的值为 10,则该函数应返回一个包含列表 1、2、3、4 和 1、4、5 和 2、3、5 和 1、9 的数组。


背景:

我正在尝试将一款名为 Pastra(或 Bastra)的旧纸牌游戏数字化,目标是从棋盘上收集纸牌。您只能收集与卡片的数值相匹配的卡片或任何与所打卡片数量相加的数字卡片。 A 是 1。

我已经有了领取等值卡的代码。

我需要的是从原始列表中创建一个值数组,其中的元素总和为给定值。

我需要知道哪个列表更大,以及哪个列表包含哪些卡片,这样就不会多次收集同一张卡片。 (注意:这超出了这个问题的范围。我想自己发现这一点,但是在这里提供关于为什么我需要这种信息的上下文)。

示例:

同上,如果棋盘有 A、2、3、4、5 和 9,如果我要打 10,我可以收集 A、2、3、4 或 A、4、5 , 或 2, 3, 5, 或 Ace, 9。


感谢您的帮助,非常感谢。

【问题讨论】:

【参考方案1】:

您首先需要创建组合,然后根据总和过滤列表

给定

这基本上是一个通用方法,它使用 位掩码 来确定访问过的组合,即。一个 30 元素的数组将占用一个 30 位的数字,它会增加要生成的数字这些位的组合...对于每个位模式,它将返回原始数组的组合

注意:如果需要,这可以与longBigInteger 一起使用

public static IEnumerable<T[]> GetCombinations<T>(T[] source)

   for (var i = 0; i < (1 << source.Length); i++)
      yield return source
         .Where((t, j) => (i & (1 << j)) != 0)
         .ToArray();

过滤器

这里不多说,根据Sum过滤组合

public static IEnumerable<int[]> GetItems(IEnumerable<int> source, int target) 
   => GetCombinations(source.ToArray())
      .Where(items => items.Sum() == target);

用法

List<int> list = new List<int>()  1, 2, 3, 4, 5, 9 ;

foreach (var found in GetItems(list,10))
   Console.WriteLine(string.Join(", ", found));

输出

1, 2, 3, 4
2, 3, 5
1, 4, 5
1, 9

【讨论】:

有更有效的方法不需要预先创建所有可能的组合,因为一旦达到或超过总和,您就不需要考虑包含更多的组合数字。如果您在一组所有卡片上运行此程序,则需要查看 2^52 个组合,如果每个卡片需要 1 纳秒,则需要 52 天。 @juharr 所以 52 天是不可接受的吗? :) 无论如何,你所说的一切似乎都是合乎逻辑的,而且很容易解决。把它写成一个答案。【参考方案2】:

这是一个递归解决方案,可以找到所有正数的组合。如果一组数字包含重复的数字,它不会删除重复的组合。

IEnumerable<IReadOnlyList<int>> FindCombosThatAddToValue(IReadOnlyList<int> numbers, int value)

    var indices = new BitArray(numbers.Count);
    var combos = new List<IReadOnlyList<int>>();
    FindCombos(0, 0);
    return combos;

    void FindCombos(int index, int total)
    
        if (index >= numbers.Count)
            return;

        var n = numbers[index];
        var newTotal = total + n;

        if (newTotal == value)
        
            // this is a matching combo so lets return it
            var combo = new List<int>();

            for (int i = 0; i < index; i++)
            
                if (indices[i])
                
                    combo.Add(numbers[i]);
                
            
            
            combo.Add(n);
            combos.Add(combo);
        
        else
        
            if (newTotal < value)
            
                // try for more including this number/index
                indices.Set(index, true); // index included in total
                FindCombos(index + 1, newTotal);
            

            // try for more not including this number/index
            indices.Set(index, false); // index not included in total
            FindCombos(index + 1, total);
        
    

【讨论】:

如果newTotal &gt; value,你会想停止递归。

从数组 Laravel 中获取元素总和

】从数组Laravel中获取元素总和【英文标题】:getelementssumfromarrayLaravel【发布时间】:2020-11-0202:57:18【问题描述】:我有一个包含另一个数组的数组,我想得到具体元素的总和数组array:1[▼0=>array:3[▼"shop_id"=>1"delegate_id"=>2"it... 查看详情

从以数组为值的哈希中获取数组

】从以数组为值的哈希中获取数组【英文标题】:Getarrayfromhashwitharraysasvalues【发布时间】:2017-07-0421:32:13【问题描述】:给定以下哈希hash,其中键作为符号,值作为数组:hash#=>:stage_item=>[:stage_batch_id,:potential_item_id],:item=>... 查看详情

获取总和为X的数组的数字列表[重复]

】获取总和为X的数组的数字列表[重复]【英文标题】:GetlistofnumbersformArrayWhosesumisX[duplicate]【发布时间】:2020-10-1313:01:41【问题描述】:我有一个号码,比如说27和一个NumbersList的列表。如何从NumbersList获得一些选定的数字,其中... 查看详情

如何从 Angular2(Typescript)中的 Json 数组中获取值的总和

】如何从Angular2(Typescript)中的Json数组中获取值的总和【英文标题】:HowtogetsumofvaluefromJsonArrayinAngular2(Typescript)【发布时间】:2018-01-3116:00:42【问题描述】:我有一个Json响应"carts":"value":["Amt":40,"Amt":20.25,"Amt":10.30]我想得到Amt字段... 查看详情

java示例代码_从列表中获取重复值的数量(计数)

java示例代码_从列表中获取重复值的数量(计数) 查看详情

使用 lambda 函数的列表中对象属性值的总和 [重复]

】使用lambda函数的列表中对象属性值的总和[重复]【英文标题】:Totalsumforanobjectpropertyvalueinalistusingalambdafunction[duplicate]【发布时间】:2012-05-0604:24:32【问题描述】:我有以下内容:List&lt;OutputRow&gt;,其中包含许多OutputRow对... 查看详情

LINQ - 从嵌套列表中获取值的总数并保存在父列表中[重复]

】LINQ-从嵌套列表中获取值的总数并保存在父列表中[重复]【英文标题】:LINQ-gettotalcountofvaluesfromnestedlistandsaveinsidetheparentlist[duplicate]【发布时间】:2020-07-1401:12:32【问题描述】:我有一个视图模型publicclassHouseReportMainModelpublicintHo... 查看详情

如何从 NSMutableArray 中获取货币总和 [重复]

】如何从NSMutableArray中获取货币总和[重复]【英文标题】:HowgetthetotalsumofcurrencyfromaNSMutableArray[duplicate]【发布时间】:2014-04-2716:06:59【问题描述】:我想从NSMutableArray计算货币总和。例如:我有一个arrayA(1,234.56,2,345.67)并且在对数... 查看详情

如何从数组中获取随机元素[重复]

】如何从数组中获取随机元素[重复]【英文标题】:Howtogetrandomelementsfromanarray[duplicate]【发布时间】:2011-11-0118:52:23【问题描述】:可能重复:JavaScript:Gettingrandomvaluefromanarrayvarnumbers=newArray(\'1\',\'2\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'10\... 查看详情

从arraylist中获取不重复的项目[关闭]

...文件中的一个随机字符串放入arraylist。但我不应该在数组列表中放置重复的元素。我怎样才能做到这一点?提前谢谢你。【问题讨论】:【参考方案1】:使用Set而不是L 查看详情

从python列表中获取元素的唯一组合[重复]

】从python列表中获取元素的唯一组合[重复]【英文标题】:Getuniquecombinationsofelementsfromapythonlist[duplicate]【发布时间】:2013-08-1415:10:27【问题描述】:编辑:这不是Howtogetallpossiblecombinationsofalist’selements?的完全相同的副本本主题是... 查看详情

通过检查两个元素从数组中获取重复值

】通过检查两个元素从数组中获取重复值【英文标题】:Getduplicatedvaluesfromanarraybycheckingwithtwoelement【发布时间】:2018-10-2601:30:01【问题描述】:如果我的数组有以下数据letarray=[name:"Ramesh",SalseVersion:10,MarketingCode:11,name:"Suresh",SalseVe... 查看详情

如何使用“减少”来获取 Dart/Flutter 中对象列表中的值的总和

】如何使用“减少”来获取Dart/Flutter中对象列表中的值的总和【英文标题】:Howtouse"reduce"togetthesumofvaluesinalistofobjectsinDart/Flutter【发布时间】:2020-08-2206:24:20【问题描述】:假设我有一个这样的对象列表:provinces=[name:\'cit... 查看详情

如何从 php 数组中删除具有特定值的所有元素? (以尽可能最短的方式)[重复]

】如何从php数组中删除具有特定值的所有元素?(以尽可能最短的方式)[重复]【英文标题】:HowdoIremoveallelementswithaparticularvaluefromaphparray?(intheshortestwaypossible)[duplicate]【发布时间】:2016-09-2412:07:08【问题描述】:例如:$array=["a",... 查看详情

数组中元素的随机总和等于y - ruby​​ [重复]

】数组中元素的随机总和等于y-ruby​​[重复]【英文标题】:Randomsumofelementsinanarrayequalstoy-ruby[duplicate]【发布时间】:2016-07-0309:38:26【问题描述】:需要创建一个总和应该等于期望值的数组。inp=[1,2,3,4,5,6,7,8,9,10]sum=200输出:out=[10,... 查看详情

从列表中删除元素时出现 UnsupportedOperationException [重复]

】从列表中删除元素时出现UnsupportedOperationException[重复]【英文标题】:UnsupportedOperationExceptionwhileremovingelementsfromlist[duplicate]【发布时间】:2013-04-0118:16:20【问题描述】:我有两个具有逗号分隔值的字符串,比如说一个具有1到10... 查看详情

在c#MVC4中获取列表框中所选值的总和

】在c#MVC4中获取列表框中所选值的总和【英文标题】:gettingthesumoftheselectedvaluesinalistboxinc#MVC4【发布时间】:2015-03-2520:53:47【问题描述】:我正在尝试创建一个多选列表框并显示其SELECTED项的总和。所以在这里我做了什么:我创... 查看详情

使用动态编程从 Python 上的子集总和问题中获取所有子集

...时间】:2021-12-2803:54:39【问题描述】:我正在尝试从元素列表中提取所有子集,这些元素的总和为某个值。例子-列表=[1,3,4,5,6]总和-9预期输出=[[3,6],[5,4]]尝试了不同的方法并获得了预期的 查看详情