首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java结合算法

2012-09-05 
java组合算法/** * 从n个数字中选择m个数字 ** @param a *传入的要选择的数字数组 * @param m *要选择的个

java组合算法

/** * 从n个数字中选择m个数字 *  * @param a *            传入的要选择的数字数组 * @param m *            要选择的个数 * @return * @throws Exception */public static List<int[]> combine(int[] a, int m) throws Exception {int n = a.length;if (m > n) {throw new Exception("错误!数组a中只有" + n + "个元素。" + m + "大于" + 2 + "!!!");}List<int[]> result = new ArrayList<int[]>();if(m==n){result.add(a);return result;}int[] bs = new int[n];for (int i = 0; i < n; i++) {bs[i] = 0;}// 初始化for (int i = 0; i < m; i++) {bs[i] = 1;}boolean flag = true;boolean tempFlag = false;int pos = 0;int sum = 0;// 首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边do {sum = 0;pos = 0;tempFlag = true;result.add(print(bs, a, m));for (int i = 0; i < n - 1; i++) {if (bs[i] == 1 && bs[i + 1] == 0) {bs[i] = 0;bs[i + 1] = 1;pos = i;break;}}// 将左边的1全部移动到数组的最左边for (int i = 0; i < pos; i++) {if (bs[i] == 1) {sum++;}}for (int i = 0; i < pos; i++) {if (i < sum) {bs[i] = 1;} else {bs[i] = 0;}}// 检查是否所有的1都移动到了最右边for (int i = n - m; i < n; i++) {if (bs[i] == 0) {tempFlag = false;break;}}if (tempFlag == false) {flag = true;} else {flag = false;}} while (flag);result.add(print(bs, a, m));return result;}private static int[] print(int[] bs, int[] a, int m) {int[] result = new int[m];int pos = 0;for (int i = 0; i < bs.length; i++) {if (bs[i] == 1) {result[pos] = a[i];pos++;}}return result;}

热点排行