一个集合的小算法

Trace__ 2018-02-06 04:38:56
比如:我有一个LIST集合:List<VisualizationModel>。


我传入100这个的一个数字。需要找到我集合里面的元素的实体属性相加起来等于100。
这个怎么写啊?

...全文
1604 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sp1234_maJia 2018-02-07
  • 打赏
  • 举报
回复
上面的逻辑规则写有问题,每一次查找都只是缩小最右边的范围这个无法穷举。你可以修正这个逻辑规则。
  • 打赏
  • 举报
回复
这里是一个很简单的递归穷举搜索。单从解题逻辑上说: ......要枚举前count个合计为sum的整数: 1. 当 count>0 时: 1.1 如果前count个元素为 sum,找到结果。 1.2 否则: 1.2.1 递归查找前 count-1个元素合计为sum的结果 1.2.2 递归查找前 count-1 个元素合计为 sum-arr[count-1]的结果 其实好的程序就是逻辑,写出子句逻辑公式反而麻烦,不如直接写程序。那么反过来说,写程序就要不能纠结什么编程语句语法,而要“成文自明”去尽量直截了当地表达逻辑。如果程序中只有一大堆某个语言的特殊编程语法,那其实就没有多大意义了。编程毕竟是最低级的事情,真正要注意的是程序背后的逻辑知识、领域知识,你换用各种编程语言都要看上去是同样的代码、同样的完全一样的代码,而绝不要纠结于某种编程语法形式。
  • 打赏
  • 举报
回复
同样的完全一样的代码 ----> 同样的完全一致的系统分析文档
  • 打赏
  • 举报
回复
给你写一个例子,假设要查找一组整数里边合计为10的组合:
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {

        static void Main(string[] args)
        {
            var arr = new int[] { 1, 2, 4, 7, 9 };
            var cnt = 0;
            foreach (var result in 组合(arr, 5, 10))
            {
                Console.Write($"第{++cnt}个答案:");
                foreach (var x in result)
                    Console.Write($"{x} ");
                Console.WriteLine();
            }
            Console.WriteLine("................按任意键结束");
            Console.ReadKey();
        }

        static IEnumerable<int[]> 组合(int[] arr, int count, int sum)
        {
            if (count > 0)
            {
                var a = arr.Take(count).ToArray();
                var s = a.Sum();
                if (s < sum)
                    yield break;

                if (s == sum)
                    yield return a;
                else
                {
                    foreach (var r in 组合(arr, count - 1, sum))
                        yield return r;
                    foreach (var r in 组合(arr, count - 1, sum - arr[count - 1]))
                        yield return r.Concat(new int[] { arr[count - 1] }).ToArray();
                }
            }
        }
    }
}
抛开程序代码本身的那点编程语句,看看函数(符号运算)递归规则。如果不理解,那说明你没有学过符号函数知识。这需要在高中没打下逻辑符号解题基础、后来需要学过一点一阶子句逻辑相关的符号化描述方法即可。
真相重于对错 2018-02-07
  • 打赏
  • 举报
回复
你的题目没有说清楚,是找所有的解,还是找最少的数字相加的结果是100,还是最快找到?
  • 打赏
  • 举报
回复
网上搜索背包算法,最简单的就是递归循环
  • 打赏
  • 举报
回复
引用 楼主 mp0258463 的回复:
比如:我有一个LIST集合:List<VisualizationModel>。 我传入100这个的一个数字。需要找到我集合里面的元素的实体属性相加起来等于100。 这个怎么写啊?
你有没有学过数学?关于函数、枚举、递归的概念?
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
给你写一个例子,假设要查找一组整数里边合计为10的组合:
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {

        static void Main(string[] args)
        {
            var arr = new int[] { 1, 2, 4, 7, 9 };
            var cnt = 0;
            foreach (var result in 组合(arr, 5, 10))
            {
                Console.Write($"第{++cnt}个答案:");
                foreach (var x in result)
                    Console.Write($"{x} ");
                Console.WriteLine();
            }
            Console.WriteLine("................按任意键结束");
            Console.ReadKey();
        }

        static IEnumerable<int[]> 组合(int[] arr, int count, int sum)
        {
            if (count > 0)
            {
                var a = arr.Take(count).ToArray();
                var s = a.Sum();
                if (s < sum)
                    yield break;

                if (s == sum)
                    yield return a;
                else
                {
                    foreach (var r in 组合(arr, count - 1, sum))
                        yield return r;
                    foreach (var r in 组合(arr, count - 1, sum - arr[count - 1]))
                        yield return r.Concat(new int[] { arr[count - 1] }).ToArray();
                }
            }
        }
    }
}
抛开程序代码本身的那点编程语句,看看函数(符号运算)递归规则。如果不理解,那说明你没有学过符号函数知识。这需要在高中没打下逻辑符号解题基础、后来需要学过一点一阶子句逻辑相关的符号化描述方法即可。
组合方法亮瞎,真是简单明了。
正怒月神 版主 2018-02-06
  • 打赏
  • 举报
回复
看起来,是背包算法

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧