我遇到组合任务的问题。我想有一个代码可以处理这个数学计算48/5 = 1712304(5!= 5 * 4 * 3 * 2 * 1 = 120 48 * 47 * 46 * 45 * 44 = 205476480 205476480/120 = 1712304)< / p>
这里有一些更多细节。 我有一个包含48个字符串的字符串数组。字符串的长度在2到3个字符之间。
string array[] = new string[]{"A1","1D","410" /*[....]*/}
我想将5个字符串组合在一起,我想用整个数组做这个,我最大的问题是组合字符串只允许包含48个字符串中的每一个。每个组合的字符串必须是唯一的。
最后我需要一个包含1712304字符串条目的List,其长度必须介于10到15之间。例如,一个字符串可能看起来像“A11A4103E1T”。
回到数学,我知道有1712304组合选项,所以任何其他结果一定是错的。这就是我出现问题的地方。
我创建了以下代码而没有成功的结果
string[] siDigit = new string[iNumDigits];
List<string> liste = new List<string>();
const int iDigitBase = 48;
const int iNumDigits = 5;
for (int i = 0; i < 1712303; ++i)
{
int i2 = i;
for (int i3 = 0; i3 < iNumDigits; ++i3)
{
siDigit[i3] = array[i2 % iDigitBase];
i2 /= iDigitBase;
}
bool duplicate_free = siDigit.Distinct().Count() == siDigit.Length;
if (duplicate_free == true)
{
liste.Add(siDigit[0] + siDigit[1] + siDigit[2] + siDigit[3] + siDigit[4]);
Console.Write(siDigit[0] + siDigit[1] + siDigit[2] + siDigit[3] + siDigit[4]);
Console.WriteLine();
}
}
我得到的是在我的列表中减少条目的方式,我只获得1317051条目并且不知道为什么。我无法找到解决问题的方法,也许有人可以帮助我。
非常感谢任何帮助。
P.S在德国,他们不会教更好的英语:)答案 0 :(得分:0)
我认为你的算法错了。
考虑i等于0,i2等于0,所以siDigit [i3](i3 = 0,1,2,3,4)是数组[0],duplicate_free是假。你输了一个。所以,你无法获得所有参赛作品。
这是一个递归算法:
private static void GetCombination(ref List<string[]> list, string[] t, int n, int m, int[] b, int M)
{
for (int i = n; i >= m; i--)
{
b[m - 1] = i - 1;
if (m > 1)
{
GetCombination(ref list, t, i - 1, m - 1, b, M);
}
else
{
if (list == null)
{
list = new List<string[]>();
}
string[] temp = new string[M];
for (int j = 0; j < b.Length; j++)
{
temp[j] = t[b[j]];
}
list.Add(temp);
}
}
}
public static List<string[]> GetCombination(string[] t, int n)
{
if (t.Length < n)
{
return null;
}
int[] temp = new int[n];
List<string[]> list = new List<string[]>();
GetCombination(ref list, t, t.Length, n, temp, n);
return list;
}