在 Java 中打印所有可能的 nCr 组合
我正在尝试打印出 nCr 的所有可能性,这些是顺序无关紧要时的组合。所以 5C1 有 5 种可能性: 1 , 2, 3, 4, 5。 5C2 有 10 种可能性: 1 2, 1 3, 1 4, 1 5, 2 3, 2 4, 2 5, 3 4, 3 5, 4 5.
我创建了一些函数来打印我想要的 r = 2、r = 3 和 r = 4 的内容,我有点看到模式,但我似乎无法为变量 r 创建一个工作方法:
public void printCombinationsChoose2(int n, int k) //for when k = 2
{
for (int a = 1; a < n; a++)
{
for (int b = a + 1; b <= n; b++)
{
System.out.println("" + a + " " + b);
}
}
}
public void printCombinationsChoose3(int n, int k) //for when k = 3
{
for (int a = 1; a < n - 1; a++)
{
for (int b = a + 1; b < n; b++)
{
for (int c = b + 1; c <= n; c++)
{
System.out.println("" + a + " " + b + " " + c);
}
}
}
}
public void printCombinationsChoose4(int n, int k) //for when k = 4
{
for (int a = 1; a < n - 2; a++)
{
for (int b = a + 1; b < n - 1; b++)
{
for (int c = b + 1; c < n; c++)
{
for (int d = c + 1; d <= n; d++)
{
System.out.println("" + a + " " + b + " " + c + " " + d);
}
}
}
}
}
public void printCombinations(int n, int k) //Doesn't work
{
int[] nums = new int[k];
for (int i = 1; i <= nums.length; i++)
nums[i - 1] = i;
int count = 1;
while (count <= k)
{
for (int a = nums[k - count]; a <= n; a++)
{
nums[k - count] = a;
for (int i = 0; i < nums.length; i++)
System.out.print("" + nums[i] + " ");
System.out.println();
}
count++;
}
}
所以我认为我最后一个方法的布局是正确的,但我只是没有做正确的事情,因为当我调用 printCominbations(5 , 2)
,它会
1 2
1 3
1 4
1 5
1 5
2 5
3 5
4 5
5 5
在应该是我之前所说的 5C2 时打印。
编辑 最后一个例子很糟糕。这是一个更好的例子来说明它做错了什么: printCombinations(5, 3)
给出了这个:
1 2 3
1 2 4
1 2 5
1 2 5
1 3 5
1 4 5
1 5 5
1 5 5
2 5 5
3 5 5
4 5 5
5 5 5
我怎样才能得到它:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
I'm trying to print out all possibilities of nCr, which are the combinations when order doesn't matter. So 5C1 there are 5 possibilities: 1 , 2, 3, 4, 5. 5C2 there are 10 possibilities: 1 2, 1 3, 1 4, 1 5, 2 3, 2 4, 2 5, 3 4, 3 5, 4 5.
I made functions that print what I want for r = 2, r = 3, and r = 4, and I sort of see the pattern, but I cant seem to make a working method for variable r:
public void printCombinationsChoose2(int n, int k) //for when k = 2
{
for (int a = 1; a < n; a++)
{
for (int b = a + 1; b <= n; b++)
{
System.out.println("" + a + " " + b);
}
}
}
public void printCombinationsChoose3(int n, int k) //for when k = 3
{
for (int a = 1; a < n - 1; a++)
{
for (int b = a + 1; b < n; b++)
{
for (int c = b + 1; c <= n; c++)
{
System.out.println("" + a + " " + b + " " + c);
}
}
}
}
public void printCombinationsChoose4(int n, int k) //for when k = 4
{
for (int a = 1; a < n - 2; a++)
{
for (int b = a + 1; b < n - 1; b++)
{
for (int c = b + 1; c < n; c++)
{
for (int d = c + 1; d <= n; d++)
{
System.out.println("" + a + " " + b + " " + c + " " + d);
}
}
}
}
}
public void printCombinations(int n, int k) //Doesn't work
{
int[] nums = new int[k];
for (int i = 1; i <= nums.length; i++)
nums[i - 1] = i;
int count = 1;
while (count <= k)
{
for (int a = nums[k - count]; a <= n; a++)
{
nums[k - count] = a;
for (int i = 0; i < nums.length; i++)
System.out.print("" + nums[i] + " ");
System.out.println();
}
count++;
}
}
So I think the layout of my last method is right, but I'm just not doing the right things, because when I call printCominbations(5, 2)
, it prints
1 2
1 3
1 4
1 5
1 5
2 5
3 5
4 5
5 5
when it should be what I said earlier for 5C2.
Edit
The last example was bad. This is a better one to illustrate what it's doing wrong: printCombinations(5, 3)
gives this:
1 2 3
1 2 4
1 2 5
1 2 5
1 3 5
1 4 5
1 5 5
1 5 5
2 5 5
3 5 5
4 5 5
5 5 5
How do I get it to be:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
怎么样:
对我来说,这个解决方案的关键是将问题视为一个编号系统,您希望将数字加一,每次达到上限时,只需将超出的部分移至左侧 1 和 。 ..你只需要正确实现递增算法......
How about this:
The key to this solution for me was to look at the problem as a numbering system and you want to increase a number by one and every time you reach an upper bound, you just carry the excess to the left one and ... You just need to implement the increasing algorithm correctly...
您的代码偏离预期的第一点是:
因此,请问自己三件事:
在给定变量状态的情况下,该行代码中应该发生什么?
为什么我的代码不完全那样做?
必须改变什么才能实现这一目标?
第一部分的答案是这样的:
2
增加到3
并且应该将以下数字设置为4
,5
, ... 与nums
的初始化类似。第二和第三部分又是你的部分了。
顺便说一句:当您因为需要更多帮助而回来时,请详细解释您到目前为止所推导出的内容并清理并缩短问题相当多。
The first point where your code deviates from the expectation is here:
So ask yourself three things:
What should have happened in that line of code with the given state of the variables?
Why doesn't do my code exactly that?
What must be changed to achieve that?
The answer for the first part is like this:
2
to3
and it should have set the following numbers to4
,5
, ... similar to the initialisation ofnums
.The second and third part is your part again.
BTW: When you come back because you need more help, please explain in detail what you have deduced so far and clean up and shorten the question quite a bit.
好的...当我们知道需要循环但不知道循环的数量时,解决方案是什么?递归...
您需要使用递归实现。请记住:任何时候,您都需要循环,但嵌套循环的数量只能在运行时知道,根据问题的具体参数,您应该使用递归方法......我会给您一些时间尝试你自己做吧,我会回来给你最终的实现......
OK... What is the solution when we know we need loops, but not the number of them?? RECURSION...
You need to use a recursive implementation. Have this in mind: ANYTIME, you need loops but the number of the nested loops can only be known at runtime, based on the specific parameters of the problem, you should use recursive methods... I'll give you some time to try it yourself, I'll be back to give you the final implementation...
我已经用c++做到了
I have done it in c++
函数
printCombination()
的布局似乎错误。 while 循环将迭代两次,分别是count = 1
和count = 2
。当
count = 1
时,只有nums[0][此处]
中的值会发生变化,因为在本例中k - count = 1
。因此,
1,2
1,3
1,4 和
1,5。
当
count = 2
时,只有nums[here][1]
中的值会改变,因为这里k - count = 0
。因此
1,5
2,5
3,5
4,5 和
5,5
The layout of function
printCombination()
seems wrong. The while loop will iterate two times, forcount = 1
andcount = 2
.When
count = 1
, only values innums[0][here]
will change, since in this casek - count = 1
.Hence,
1,2
1,3
1,4 and
1,5.
And when
count = 2
, only values innums[here][1]
will change, since herek - count = 0
.Hence
1,5
2,5
3,5
4,5 and
5,5