【发布时间】:2018-02-02 11:53:25
【问题描述】:
我正在尝试获得至少达到 100 的所有组合。如果将一个组合添加到另一个组合中,则 10+10+10+10+10+10+10+10+10+10(100)>= 100,还有 20+20+20+20+10+15(105)>=100。但是现在它只显示了一些,因为我不知道我怎样才能让他显示所有可能的组合。
我会在一段时间内使用 for 循环,因此它会一直添加到超过 'GETALTEBEREIKEN' 为止。但它会在添加完所有内容后进行检查。即使添加了它,我也不会得到 10*10。因为它只会转到数组中的下一个数字。所以它并没有给我所有的组合。
static void Main(string[] args)
{
const int TOTAALGETALLEN = 3;
const int GETALTEBEREIEKEN = 100;
int[] Getallen = new int[TOTAALGETALLEN];
Getallen[0] = 10;
Getallen[1] = 15;
Getallen[2] = 20;
int totaal = 0;
string GebruikteGetallen;
for(int i = 0; i < TOTAALGETALLEN; i++)
{
totaal = Getallen[i];
GebruikteGetallen = i + ", ";
while (totaal<GETALTEBEREIEKEN)
{
for(int j = 0; j < TOTAALGETALLEN; j++)
{
totaal += Getallen[j];
GebruikteGetallen += j + ", ";
}
}
Console.WriteLine(GebruikteGetallen);
Console.WriteLine(totaal);
}
Console.ReadLine();
}
它应该是满足标准的子集(一组元素的组合)。
我还发现了这个:
static void Main(string[] args)
{
int[] set = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
foreach (string s in GetCombinations(set, 18, ""))
{
Console.WriteLine(s);
}
Console.ReadLine();
}
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;
}
}
}
}
}
但这不会让我再次使用相同的号码。也许它会对你的答案有所帮助。
【问题讨论】:
-
这里通常不欢迎就某些学校项目寻求帮助的问题。我建议你向你的老师寻求帮助。
-
项目应该做什么,它做了什么?
-
@RobAnthony 我需要看看有哪些可能的组合,如果超过 100 就可以了,但如果它已经超过 100 并且您广告更像另一个 10,您将得到 110,那只会“成本”更多。最后,Getallen 的每个 Getal 都会得到自己的“成本”,这就是为什么我需要知道使用了哪些数字。所以我可以计算出最便宜的选择。
-
实际上,如果一个问题是明确的,如果它表明有人试图回答它,我认为为什么问这个问题是没有问题的——学校项目问题不纯粹是由定义不受欢迎。当问题只是被抛到这里而没有尝试回答时,它是不受欢迎的。我认为这个问题需要编辑,以使其更清楚它试图做什么以及目前出了什么问题。
-
我还是不明白你在问什么。您是否想要 10、15 和 20 的所有不同组合至少达到 100?
标签: c# arrays combinations