import java.util.ArrayList;
import java.util.List;
public class PickingATeam {
public static void main(String[] args) {
PickingATeam pick = new PickingATeam();
List<String> ls = new ArrayList<String>();
ls.add("A");
ls.add("B");
ls.add("C");
ls.add("D");
// ls.add("E");
// ls.add("F");
// ls.add("G");
// ls.add("H");
// ls.add("I");
// ls.add("J");
String[] s = ls.toArray(new String[4]);
s = pick.pick(s, 0, ls.size(), 4);
for (int i = 0; i < s.length; i++) {
System.out.println(s[i]);
}
}
public String[] pick(String[] ls, int start, int end, int teamNum) {
// if the number you found is smaller than 0 ,it is invalid.
// if the number you found is bigger than the length of collection.
// invalidate!
if (teamNum < 1 || teamNum > (end - start)) {
return new String[0];
}
// if teamNum is 1, all the elements will be returned.
if (teamNum == 1) {
String[] candidate = new String[end - start];
for (int i = 0; i < candidate.length; i++) {
candidate[i] = ls[start + i];
}
return candidate;
}
// (n, k) = (n – 1, k – 1) + (n – 1, k);
// in the first part, only n-1 elements will be used. the n element will
// combin will the (n – 1, k – 1)result.
// this is that n element which is not included when picking the team.
String FirstElem = ls[start];
// getting (n-1,k-1);and combin with element n;
String[] firPart = combin(FirstElem,
pick(ls, start + 1, end, teamNum - 1));
// getting (n – 1, k);
String[] secondPart = pick(ls, start + 1, end, teamNum);
// code below are used to merge the result.
int fristPartLength = firPart.length;
int secondPartLength = secondPart.length;
String[] pickingResult = new String[fristPartLength + secondPartLength];
for (int i = 0; i < fristPartLength + secondPartLength; i++) {
if (i < fristPartLength) {
pickingResult[i] = firPart[i];
} else {
pickingResult[i] = secondPart[i - fristPartLength];
}
}
return pickingResult;
}
/**
* combin(a,[b,c,d]); return[ab,ac,ad]
* */
private String[] combin(String elem, String[] all) {
String[] local = new String[all.length];
for (int i = 0; i < all.length; i++) {
local[i] = all[i];
}
for (int i = 0; i < local.length; i++) {
local[i] = elem + local[i];
}
return local;
}
}
分享到:
相关推荐
组合数,也称为二项式系数,表示从n个不同的元素中无序地选取m个元素的方法数。本篇文章将深入讲解如何用C语言计算组合数,并提供一个简单的C程序示例。 首先,我们要理解组合数的公式。组合数可以用阶乘的形式表示...
C语言程序设计-编写main程序调用函数fact求解从m个元素选n个元素的组合数的个数;计算公式是: 组合数=m!(n!.(m-n)!);要求m不能小于n,否则应有容错处理;说明:函数fact(x)的功能是求x!;
假设有个集合拥有m个元素,任意的从集合中取出n个元素,则这n个元素所形成的可能子集有那些?
有m个数组,每个数组有n个元素。列出所有可能的组合。 如:arr1{aa,bb,cc},arr2{11,22,33},得到的组合是: aa11,aa22,aa33,bb11,bb22,bb33,cc11,cc22,cc33
5. 在递归返回时,将当前元素从选择集合中移除,回溯到上一步。 非递归方法,也称为迭代法,通常涉及使用一个辅助数组来存储当前选择的元素,并通过改变选择状态(例如,从未选择变为已选择)来生成所有组合。以下...
从N选取M个数的所有组合数C++描述 思路: 第一位可以取N中的任何一个,第二位只能取第一位后面的数字任何一个, 即第M位只能取第M-1位后面的数字任何一个,每一位递归一次
这是组合数学中的术语,表示从一个包含m个不同元素的集合中选择n个元素的组合方式,不考虑元素的顺序。组合的数量可以通过组合公式C(m, n) = m! / (n!(m-n)!)计算,其中"!"代表阶乘。 VBA实现这个功能通常涉及循环...
适用于算法课程求n个元素的全排列,从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 公式:全排列数f(n)=n!(定义0!=1)
编写一个在具有m行n列的二维数组各元素中找出最大元和最小元并显示在屏幕上的函数模板,并通过主函数对它进行调用以验证其正确性。例如,可设计该函数模板的原型为: template <class Type> void maxMin (Type *A,...
然后,通过一个for循环从数组的第二个元素开始遍历,如果当前元素大于已知的最大值,就更新最大值。当遍历完整个数组后,返回找到的最大值。 这种方法虽然简单,但效率并不高,因为它的时间复杂度是O(n),其中n是...
请设计算法完成螺旋阵的输出,具有要求为:输入一个m行n列的矩阵,按顺时针螺旋顺序输出矩阵中的所有元素。 【输入】 第1行输入两个正整数m和n,表示m行n列的矩阵; 从第2行开始按行输入该矩阵的所有元素。 【输出】...
当m大于n时,这个表达式可以用于计算特定组合的数量,因为在组合问题中,我们通常关心的是在不考虑顺序的情况下,从m个不同元素中选取n个的方法数量。这个数量可以用组合公式C(m, n) = m!/ (n!(m-n)!)来表示,其中C...
排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的所有可能的方式;组合则是指不考虑元素的顺序,仅考虑元素的选取。在这个问题中,我们不仅要考虑元素的选取,还要考虑它们的顺序,因此属于...
如果矩阵A中存在这样的一个元素A[i][j]满足条件“A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素”,则称之为该矩阵的一个马鞍点。编写一个函数,计算出m*n的矩阵A的所有马鞍点
代码实现时,我们可以定义一个方法,接收两个参数:n(要选择的元素数)和m(组合中元素的数量)。该方法首先会创建一个长度为n的`BitArray`,然后遍历0到2^n - 1之间的所有整数,将每个整数的二进制表示转化为实际...
具体来说,给定一个包含`n`个元素的集合`R={r1,r2,… ,rn}`,其中元素之间可能存在重复。目标是找出这个集合的所有不同的排列组合。 #### 输入格式 输入数据由多组测试数据组成。对于每组测试数据: - 第一行是一...
全排列是指从n个不同元素中取出n个元素,按照一定的顺序排列,所有可能的排列组合。在给定的C程序中,`Perm`函数通过递归实现了全排列的生成。其基本思想是: 1. 当只有一个元素时,输出这个元素即为一种排列。 2. ...
在数据结构的学习中,我们经常会遇到对数组进行操作的问题,比如本题中提出的"将含有n个整数元素的数组循环右移m位"。这是一个典型的问题,它涉及到数组的操作和算法的设计。在这个问题中,我们需要确保算法的空间...
- 第二行包含 n 个整数,表示序列中的元素。 **输出**: - 输出一行,包含一个整数,即 m 个子序列的和的最大值的最小可能值。 #### 示例 **输入示例**: ``` 1 1 10 ``` **输出示例**: ``` 10 ``` #### 解决方案...
`,该函数的功能是将数组`a`中的前`m`个元素与后`n`个元素进行位置上的交换。例如,如果数组为`a1, a2, ..., aM, aM+1, aM+2, ..., aM+N`,经过函数处理后,数组变为`aM+1, aM+2, ..., aM+N, a1, a2, ..., aM`。 ##...