工程中碰到根据客户提供的优惠券获取最优的组合情况。我采取的以序号的方式把所有可能的结果计算出来,然后进行比较排序,获取最优的组合。
方式如下:
/// <summary>
/// 计算赠送红包金额
/// </summary>
[TestMethod]
public void Combination()
{
var abc = MakeStrings(new string[] { "a", "b", "c","d","e","f","g" }).GetEnumerator();
int i=0;
while (abc.MoveNext())
{
i++;
LogHelper.Debug(i.ToString() +" :"+abc.Current.ToString());
}
}
static List<string> MakeStrings(string[] chars)
{
List<string> temp = new List<string>();
if (chars.Length == 1)
{
temp.Add(chars[0]);
}
if (chars.Length == 2)
{
temp.Add(String.Format("{0}-{1}", chars[0], chars[1]));
temp.Add(String.Format("{0}-{1}", chars[1], chars[0]));
}
else
{
for (int i = 0; i < chars.Length; i++)
{
var newchar = new string[chars.Length - 1];
Array.Copy(chars, 1, newchar, 0, chars.Length - 1);
foreach (var item in MakeStrings(newchar))
{
string str = String.Format("{0}-{1}", chars[0], item);
temp.Add(str);
}
string t = chars[0];
for (int o = 0; o < chars.Length; o++)
{
if (o==chars.Length-1)
{
chars[o] = t;
}
else
{
chars[o] = chars[o + 1];
}
}
}
}
return temp;
}