`
shuishou119800
  • 浏览: 7673 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

带条件的排列组合算法分析

阅读更多

算法说明:

用1、2、2、3、4、5这六个数字打印出所有不同的排列,如:512234、412345等。要求:"4"不能在第三位,"3"与"5"不能相连

  

算法代码:

public class PermutationAlgo {
  private int count = 0;
  
  public void calculate(){
    String eleStr = "122345";
    depthSearch(eleStr, "");
    System.out.println("符合条件的总结果数为:"+count+"条");
  }
  
  /**
   * @param eleStr - 待分配字符组成的串
   * @param rstStr - 已分配字符组成的串
   */
  public void depthSearch(String eleStr, String rstStr) {
    if (eleStr.length() == 0) {
      count++;
      System.out.println(rstStr);
      return;
    }
    for (int i = 0; i < eleStr.length(); i++) {
      String currEle = eleStr.substring(i, i + 1); //取出当前位的值
      if (rstStr.length() == 2 && "4".equals(currEle)) continue; //剪掉第三位为4的分支
      if (rstStr.endsWith("3") && "5".equals(currEle)) continue; //剪掉"35"相连的分支
      if (rstStr.endsWith("5") && "3".equals(currEle)) continue; //剪掉"53"相连的分支
      if (eleStr.substring(0, i).indexOf(currEle) != -1) continue; //剪掉同一位上字符重复的分支(此题即剪掉重复的2)
      depthSearch(eleStr.substring(0, i) + eleStr.substring(i + 1), rstStr + currEle); //用剩余的合法串继续递归
    }
  }
  
  public static void main(String[] args) {
    new PermutationAlgo().calculate();
  }
}

 

 

算法分析:

因为是排列组合所以用递归

因为有条件所以递归时要剪枝

可用公式算出合法的排列数,以验证结果:

 

  (A66 - A55 - 2·A55 + 2·C13·A33)/2 = 198

 

  第一项为全排列的数量

  第二项为"4"在第三位的数量

  第三项为"3"与"5"相连的数量

  第四项加回二三项重复减去的数量

  因为排列中有两个相同的字符"2",且在各个位置出现的概率相同,故需将整个结果除2修正

 

此题本身并不难,因为在论坛上看到很多人对排列组合的算法缺乏一般的解题思路,因而贴出,希望能给大家带来帮助。

分享到:
评论
2 楼 王书兴 2010-12-29  
似乎有问题吧 ,字符串中的数字是按顺序取的,并没有进行排列啊
1 楼 yangguo 2010-09-26  
引用
  if (eleStr.substring(0, i).indexOf(currEle) != -1) continue; //剪掉同一位上字符重复的分支(此题即剪掉重复的2) 


为什么这样能剪掉重复?

相关推荐

    组合数学(第4版) 卢开澄 卢华明

    本书是《组合数学》第3版的修订版,全书共分8章,分别是:排列与组合、递推关系与母函数、容斥原理与鸽巢原理、burnside引理与polya定理、区组设计、线性规划、编码简介、组合算法简介。丰富的实例及理论和实际相...

    软件工程之专题十:算法分析与设计

    专题十:算法分析与设计 1.常用的算法设计方法:  1.1 迭代法  1.2 穷举搜索法  1.3 递推法  1.4 递归法  1.5 贪婪法  1.6 分治法  1.7 动态规划法  1.8 回溯法 算法基础部分: 算法是对特定问题求解步骤的一...

    数据结构经典问题和算法分析

    程序引入变量a、b、c、d、e、f,并让它们分别顺序取1至6的证书,在它们互不相同的条件下,测试由它们排成的如图所示的三角形三条边上的变量之和是否相等,如相等即为一种满足要求的排列,把它们输出。当这些变量取尽...

    ACM算法竞赛常用代码

    组合数学(排列与组合,鸽笼原理,容斥原理,递推,Fibonacci数列,Catalan数列,Stirling数,差分序列,生成函数,置换,Polya原理) 概率论(简单概率,条件概率,Bayes定理,期望值) 矩阵(矩阵的概念和运算...

    历届系统分析师考试数学知识点细分统计

    1990 8 排列组合问题,二元关系, 1991 13 Chomsky形式语言分层理论 1991 14 图,最大强联通子图,最大单向联通子图 1992 13 谓词,永真式,合取范式,前束合取范式。 1992 14 代数系统二元关系,群 2004下 6~7 ...

    使用C语言解决字符串全排列问题

    这是典型的递归求解问题,递归算法有四个特性: 必须有可达到的终止条件,否则程序陷入死循环 子问题在规模上比原问题小 子问题可通过再次递归调用求解 子问题的解应能组合成整个问题的解 对于字符串的排列问题...

    leetcode答案-LeetCode:不要放弃

    递回求解,通常用于需暴力找出所有排列组合,但又需排除掉某些不正确的组合时使用,通常会有三个主要部分: 递回函式的符合条件 当结果符合时,储存或输出答案,并跳离递回。 递回函式的参数 一定会有一个result用于...

    软件工程-期末.doc

    在发现错误后,排列应由()完成 答:软件的开发者 软件工程的出现是由于 答:计算机软件的发展 下列哪个阶段不属于软件生存期的三大阶段 答:编码阶段 下列哪种方法不是度量效益的方法 答:算法模型古迹 需求分析是 ...

    Design-of-Computer-Programs-Udacity

    排列组合。 密码学; 递归和一厢情愿的想法; 最长回文子串算法。 第 3 课:正则表达式、其他语言和解释器 定义正则表达式的语言; 口译语言; 定义正则表达式匹配的字符串集; 其他语言。 第 4 课:通过搜索处理...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识到高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...

    《Excel应用大全》示例文件 光盘文件

    • 多条件组合查询资料 • 利用INDEX函数结合MATCH函数进行向左查找 • 实现根据学员成绩查询等级 • 确定工资单中最后一名员工的位置 • 根据工资表生成工资条 • 利用CHOOSE函数重新生成内存数组 • 利用查找函数...

    C++ STL 开发技术导引(第6章)

    23.29 上一排列组合prev_permutation 409 23.30 本章小结 411 第24章 数值算法 412 24.1 递增赋值iota 412 24.2 元素求和accumulate 413 24.3 两序列元素内积inner_product 414 24.4 部分元素求和...

    C++ STL开发技术导引(第5章)

    23.29 上一排列组合prev_permutation 409 23.30 本章小结 411 第24章 数值算法 412 24.1 递增赋值iota 412 24.2 元素求和accumulate 413 24.3 两序列元素内积inner_product 414 24.4 部分元素求和...

    C++ STL开发技术导引(第3章)

    23.29 上一排列组合prev_permutation 409 23.30 本章小结 411 第24章 数值算法 412 24.1 递增赋值iota 412 24.2 元素求和accumulate 413 24.3 两序列元素内积inner_product 414 24.4 部分元素求和...

    计算机要学哪些东西----(还有附赠哦)

    4. 应用概率工具如Monte Carlo方法、算法的平均情况分析和散列法来解决问题。 程序设计基础(PF) PF1.基本程序设计结构[核心] PF2.算法和问题求解[核心] PF3. 基本的数据结构[核心] PF4. 递归[核心] PF5. 事件...

    编译原理(第2版)课件

    6.3.4 算符优先分析算法 6.3.5 优先函数 6.3.6 算符优先分析法的局限性 6.4 典型例题及解答 练习第7章 LR分析 7.1 LR分析概述 7.2 LR(0)分析 7.2.1 可归前缀和子前缀 7.2.2 识别活前缀的有限自动机 7.2.3 活前缀...

    2025NOIP普及组.rar

    也无数学公式可寻,看来只能搜索(组合的生成算法),其实1这个约束条件也暗示我们本题搜索是有希望的,组合的生成可用简单的DFS来实现,既搜索这k个整数在原数列中的位置,由于组合不同于排列,与这k个数的排列顺序...

Global site tag (gtag.js) - Google Analytics