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