• C(m,n)算法


    排列组合:C(m,n),m为给定数列,n为要从数列m中取元素的数量,GetResult()获取所有不重复的组合。

     public class MathCombination<T>
        {
            List<T> list;
            int count = 0;
    
            private MathCombination()
            {
                
            }
    
            public MathCombination(List<T> l, int c)
            {
                list = l;
                count = c;
            }
    
            public List<List<T>> GetResult()
            {
                List<List<T>> result = new List<List<T>>();
                List<Dictionary<int, T>> list = GetCombination();
                foreach (Dictionary<int, T> item in list)
                {
                    result.Add(item.Select(d => d.Value).ToList());
                }
                return result;
            }
    
            private List<Dictionary<int, T>> GetCombination()
            {
                List<Dictionary<int, T>> result = new List<Dictionary<int, T>>();
    
                List<Dictionary<int, T>> tempList = new List<Dictionary<int, T>>();
                Dictionary<int, T> tempDic = new Dictionary<int, T>();
    
                for (int i = 0; i < list.Count; i++)
                {
                    Dictionary<int, T> dic = new Dictionary<int, T>();
                    dic.Add(i, list[i]);
                    tempList.Add(dic);
    
                    tempDic.Add(i, list[i]);
                }
    
                result = tempList;
                for (int i = 1; i < count; i++)
                {
                    result = GetCartesian(result, tempDic);
                }
    
                return result;
            }
    
            private List<Dictionary<int, T>> GetCartesian(List<Dictionary<int, T>> listDic, Dictionary<int, T> dic)
            {
                List<Dictionary<int, T>> result = new List<Dictionary<int, T>>();
                foreach (Dictionary<int, T> d in listDic)
                {
                    foreach (KeyValuePair<int, T> k in dic)
                    {
                        if (!d.ContainsKey(k.Key) && d.Keys.OrderByDescending(o => o).FirstOrDefault() < k.Key)
                        {
                            Dictionary<int, T> tempDic = new Dictionary<int, T>(d);
                            tempDic.Add(k.Key, k.Value);
                            result.Add(tempDic);
                        }
                    }
                }
                return result;
            }
    
        }

    调用:

                List<decimal> listOdd = new List<decimal>() { 1.0M, 2.0M, 3.0M, 4.0M };
    
                MathCombination<decimal> m = new MathCombination<decimal>(listOdd, 4);
                List<List<decimal>> list = m.GetResult();
  • 相关阅读:
    静态方法
    表单的验证
    jquery笔记
    jquery参考
    dom体系 和获取其他页面的Window对象
    jsRegExp对象
    jsDate对象
    js案例
    Sqli-Labs 闯关 less 42-53
    Sqli-Labs 闯关 less 32-41
  • 原文地址:https://www.cnblogs.com/jiajinyi/p/3858343.html
Copyright © 2020-2023  润新知