JJY

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();

posted on 2014-07-21 14:21  MikeJia  阅读(3438)  评论(0编辑  收藏  举报

导航