我有一个有效的代码,可以找到等于18的数字的所有可能组合。我想在程序中实现它, 问题是我需要识别这些数字中的每个数字,因为其中一些是重复的。然后程序将分别与它们一起运行。
具体来说,我有一组权重和位置,每个位置都有一个权重。
我需要找到不超过一定重量的这些位置的组合,然后一个个地找到它们。
问题是,如果在两个位置的重量与我确定的重量相同,则首先要到达一个位置,然后再到达另一个位置。
非常感谢!
int[] set = { 1, 2, 3, 1, 5, 6, 2}; //weights
foreach (string s in GetCombinations(set, 18, "")) //18 max weight
{
textBox1.Text += s + Environment.NewLine;
}
public static IEnumerable<string> GetCombinations(int[] set, int sum, string values)
{
for (int i = 0; i < set.Length; i++)
{
int left = sum - set[i];
string vals = set[i] + "," + values;
if (left == 0)
{
yield return vals;
}
else
{
int[] possible = set.Take(i).Where(n => n <= sum).ToArray();
if (possible.Length > 0)
{
foreach (string s in GetCombinations(possible, left, vals))
{
yield return s;
}
}
}
}