`

组合算法之01转换法

阅读更多

import java.util.ArrayList;
import java.util.List;

/**
 * 组合算法: 01转换法
 * 求从数组a[1..n]中任选m个元素的所有组合(无重复)
 *
 * 所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。
 * 组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。
 * 解决组合问题的通用算法不外乎递归和回溯(就是穷举法)两种。
 *
 */
public class Combination {

 int arr[]=new int[]{1,3,5,7,4,};
 int n=3;
 int m=arr.length;
 
 int newArr[];
 List result=new ArrayList();
 /**
  * 从数组arr中取出n个数的组合(无重复)
  * 1代表取,0表示不取
  *
  */
 public static void main(String[] args) {
  Combination c=new Combination();
  
  c.combin();
 }
 
 void combin(){
  newArr=new int[m];
  for(int i=0;i<m;i++){
   if(i<n){
    newArr[i]=1;//从长度为的数组中取出n个数的组合:11100   前面n个1
   }
   else{
    newArr[i]=0;
   }
  }
  
  boolean isExit=true;
  do{
   prt();
   for(int k=m-n;k<m;k++){//最后一个组合,1全在右边
    isExit=false;
    if(newArr[k]!=1){
     isExit=true;
     break;
    }
    
   }
   //10转换01,通过11100 把10循环转换01,直到变为00111结束
   for(int j=0;j<m-1;j++){
    if((newArr[j]==1&&newArr[j+1]==0)){
     newArr[j]=0;
     newArr[j+1]=1;
     break;
    }
   }
  }while(isExit);
  
 }
 //根据newArr数组取出1对应的arr数组的值
 void prt(){
  int ac[]=new int[n];

  int num=0;
  for(int i=0;i<m;i++){
   if(newArr[i]==1){
    System.out.print(arr[i]);
    ac[num++]=arr[i];
   }
  }
  result.add(ac);//取n位的所有组合(无重复:135表示了315,153,351,513,531)
  System.out.println();
 }

}

分享到:
评论

相关推荐

    算法设计 蛮力法 分治法 动态规划 贪心算法 分支限界法 回溯法 近似算法 减制法

    下面将详细讲解标题和描述中提及的八种算法设计方法:蛮力法、分治法、动态规划、贪心算法、分支限界法、回溯法、近似算法以及减制法。 1. **蛮力法(Brute Force)**: 蛮力法是最直观的解决问题的方法,通常通过...

    算法中级01.zip。窗口打表法+预处理

    在“算法中级01”这个主题中,可能包含的课程或练习内容可能涵盖如何运用这两种技术解决实际问题,例如滑动窗口在时间序列分析中的应用,预处理在机器学习模型训练中的作用,以及如何设计和实现这些算法的优化版本。...

    学习常用算法之(5)递归法

    在【标题】"学习常用算法之(5)递归法"和【描述】中,递归被解释为一种像故事中老和尚讲故事一样自我包含和无限延续的概念。 在【部分内容】中,以小猴吃枣为例,展示了如何通过递归来解决问题。小猴每天吃掉前一天...

    组合计数应用与算法相关

    组合计数是算法中的一种重要概念,涉及到排列、组合、概率论和数学归纳法等多个领域。在实际问题中,组合计数常用于解决各种计数问题,如统计可能性、优化路径选择、数据压缩等。以下将针对给定的题目内容进行详细...

    5个字符的自由组合 算法

    "5个字符的自由组合算法"是一个关于生成所有可能排列组合的问题,这通常涉及到组合数学和递归算法的知识。在这个问题中,我们需要生成一个字符串集合,这个集合包含了所有由5个字符组成的可能的不同序列。 首先,...

    组合数学中的全排列生成算法

    组合数学中的全排列生成算法是解决数学问题和编程挑战中不可或缺的部分,特别是在处理组合和排列问题时。全排列指的是从n个不同元素中取出n个元素的所有可能排列方式。在这个问题中,我们将探讨六种常用的全排列生成...

    基于优化算法的股票投资组合模型选择

    文章提出的核心内容是基于风险和收益的不同约束条件下,构建不同的最优资产组合模型,并采用遗传算法和拉格朗日法等优化算法对这些模型进行优化计算。通过比较不同优化算法的计算结果,旨在得出更优的最优资产组合...

    C++回溯算法实验报告

    在这个C++实验中,我们分别通过两个实例来探讨回溯法的应用。 首先,实验的第一个问题是删数问题。这个问题要求在给定的n位正整数a中去掉k个数字,使得剩下的数字排列成的新正整数尽可能大。为了解决这个问题,我们...

    投影追踪法_投影追踪法matlab_遗传算法_投影法_

    在投影追踪法中,这可能涉及到两个投影方向的线性组合或其他线性变换。 6. **变异操作**:为保持种群的多样性,对部分个体进行变异。在投影方向上,变异可能表现为微小的向量扰动。 7. **停止条件**:循环执行以上...

    Gear_吉尔数值算法_吉尔算法_GEAR算法_GeaR微分方程_

    具体来说,吉尔算法的核心在于使用了隐式Runge-Kutta方法,它将解表示为指数形式的组合,然后通过代数方式求解。这种方法通常涉及到一个非线性系统的求解,这可以通过牛顿迭代法或其他迭代技术来完成。每一步迭代都...

    电子功用-基于突变点检测组合算法的电力系统故障数据匹配方法

    组合算法则意味着该方法可能结合了多种突变点检测技术,比如滑动窗口法、局部平均法、Cusum(累积和)检验、Prophet算法等。每种方法都有其优缺点,组合使用可以互补不足,提高检测的准确性和鲁棒性。例如,滑动窗口...

    大数除法算法

    大数除法算法的核心思想是将一个大数拆分成多个较小的部分,然后逐位进行除法运算,并最终组合得到结果。具体步骤如下: 1. **初始化**:首先读取输入的两个数`a`和`b`,其中`a`是被除数,`b`是除数。 2. **准备...

    C#中实现任意List的全组合算法代码

    全组合算法,又称为二进制计数法或位操作法,其基本思想是通过遍历一个范围为2^n(n为列表元素个数)的整数序列,利用二进制表示来确定每个元素是否包含在当前组合中。以下是一个具体的C#实现: 首先,我们创建一个...

    模式空间法_模式空间算法_模式空间法_圆阵模式空间_DOA_DOA估计_

    模式空间算法首先涉及到阵列的参数化,即将圆阵中的信号响应表示为一组基函数的线性组合。这些基函数通常是由阵列几何决定的,比如球谐函数或者极坐标下的正弦和余弦函数。通过这种参数化,我们可以将圆阵的数据转换...

    二值化转换与抖动算法

    自适应阈值法是一种基于图像的局部特点的二值化转换算法。该算法首先将图像分成多个小块,然后对每个小块进行阈值选择,最后将每个小块的阈值组合起来得到最终的阈值T。 双固定阈值法是一种特殊的自适应阈值法。该...

    基于编码转换的离散演化算法设计与应用.pdf

    本文提出了一种基于编码转换法(ETM, Encoding Transformation Method)来设计DisEA的新策略,该策略借鉴了遗传算法(GA)、二进制粒子群优化(BPSO)和二进制差分演化(HBDE)中的映射方法。编码转换法旨在将连续空间的操作...

    算法设计与分析基础 Chapter 01

    5. **编码实现**:将设计好的算法转换为程序代码。 6. **测试和调试**:通过不同的测试用例对程序进行测试,确保其功能正确无误。 7. **维护和改进**:随着需求的变化和技术的进步,不断优化和调整算法。 #### 1.3 ...

Global site tag (gtag.js) - Google Analytics