- 浏览: 2035589 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
简单算法:
从前往后(或者从后往前)每次交换一个位置。当存在一个到达最后位置时,需要调整整个数组的位置。将所有的0(1)的位置向后整体移动一位。
直到结束。
#include <iostream> #include <assert.h> #include <new> using namespace std; void PrintArr(const int* pnArr, const int nLen); int Combin(const int m, const int n); bool IsEndofCombin(const int* pnArr, const int m, const int n); bool ChangeArr(int* pnArr, const int m, const int n); int main() { int m = 0; int n = 0; while (true) { cout << "please input m:"; cin >> m; cout << "please input n:"; cin >> n; Combin(m, n); } return 0; } void PrintArr(const int* pnArr, const int nLen) { assert(pnArr && nLen > 0); int i = 0; for (i = 0; i < nLen; i++) { if (pnArr[i] > 0) { cout << char('A' + i); } } cout << endl; } bool IsEndofCombin(const int* pnArr, const int m, const int n) { assert(pnArr && m > 0 && n > 0 && m >= n); bool bResvr = n > m / 2 ? true : false; if (m == n) { return false; } int i = 0; if (bResvr) { for (i = 0; i < m - n; i++) { if (pnArr[i] > 0) { return false; } } } else { for (i = n; i < m; i++) { if (pnArr[i] < 0) { return false; } } } return true; } bool AdjustArr(int* pnArr, const int m, const int n) { assert(pnArr && m > 0 && n > 0 && m >= n); if (m == n) { return false; } bool bResvr = n > m / 2 ? true : false; int i = 0; int j = 0; if (bResvr) { for (i = 0; i < m - n; i++) { if (pnArr[i] > 0) { break; } } //如果交换完成 if (i >= m -n ) { return false; } //开始交换 if (pnArr[0] > 0) { return false; } //找到需要移动的位置,从此位置向前移动一位 for (i = m - 1; i >= 0; i--) { if (pnArr[i] <= 0) { break; } } for (j = 0; j < m; j++) { pnArr[j] = 1; } for (j = 0; j < m - n; j++) { pnArr[--i] = 0; } return true; } else { for (i = 0; i < m - n; i++) { if (pnArr[m - i - 1] <= 0) { break; } } //交换完毕 if (i >= m - n) { return false; } //开始交换 if (pnArr[m - 1] <= 0) { return false; } //找到需要移动的位置,从此位置向后移动一位 for (i = 0; i < m; i++) { if (pnArr[i] > 0) { break; } } for (j = 0; j < m; j++) { pnArr[j] = 0; } for (j = 0; j < n; j++) { pnArr[++i] = 1; } return true; } return true; } bool ChangeArr(int* pnArr, const int m, const int n) { assert(pnArr && m > 0 && n > 0 && m >= n); if (m == n) { return false; } bool bResvr = n > m / 2 ? true : false; int i = 0; int nPlace = 0; int nTime = 0; if (bResvr) { nPlace = 0; for (nTime = 0; nTime < m - n; nTime++) { for (i = nPlace; i < m; i++) { if (pnArr[i] <= 0) { //change if (i > nPlace) { int nTmp = pnArr[i]; pnArr[i] = pnArr[i - 1]; pnArr[i - 1] = nTmp; return true; } else { nPlace++; break; } } } } } else { nPlace = m - 1; for (nTime = 0; nTime < m - n; nTime++) { for (i = nPlace; i >= 0; i--) { if (pnArr[i] > 0) { //change if (i < nPlace) { int nTmp = pnArr[i]; pnArr[i] = pnArr[i + 1]; pnArr[i + 1] = nTmp; return true; } else { nPlace--; break; } } } } } return false; } //get n combin from m numbers int Combin(const int m, const int n) { assert(m > 0 && n > 0 && m >= n); int* pnArr = new(nothrow) int[m]; if (NULL == pnArr) { return -1; } //int aray memset(pnArr, 0, sizeof(int) * m); int i = 0; for (i = 0; i < m; i++) { pnArr[i] = i < n ? 1 : 0; } int nCount = 0; PrintArr(pnArr, m); nCount++; while (true) { if (!ChangeArr(pnArr, m, n)) { cout << "total count:" << nCount << endl; break; } PrintArr(pnArr, m); nCount++; //adjust value if (AdjustArr(pnArr, m, n)) { PrintArr(pnArr, m); nCount++; } } return 0; }
发表评论
-
Berkeley DB 使用经验总结
2012-08-27 14:41 3086作者:陈磊 NoSQL是现在互联网Web2.0时代备受 ... -
嵌入式数据库系统Berkeley DB
2012-08-27 14:37 1533前言 UNIX/LINUX平台下的数据库种类非常多 ... -
C语言中标准输入流、标准输出流、标准错误输出流
2011-06-13 14:32 9291C语言中标准输入流、标准输出流、标准错误输出流 在 ... -
Rsync 实现原理
2011-05-12 20:06 8318Rsync 实现原理 前言 关于rsync的原始文档 ... -
c++简单的虚函数测试
2011-04-27 14:25 1019#include <iostream> u ... -
C++文件行查找
2011-04-26 14:10 1408#include <iostream> # ... -
c++偏特化简单示例
2011-04-13 11:17 2156c++偏特化 // temp1.c ... -
GDB调试精粹及使用实例
2011-03-16 14:06 1140GDB调试精粹及使用实例 一:列文件清单 1. ... -
简单的ini文件解析
2011-02-12 16:36 1619int GetKeyVal(const string s ... -
scanf族函数高级用法
2011-01-25 16:00 2559如何解释 fscanf(fd,&quo ... -
使用scons替代makefile(1)
2011-01-25 11:58 3730早在多年前我刚开始接触linux下的C程序时,经常被makef ... -
使用scons替代makefile(2)
2011-01-25 11:57 3583本篇文章接着上一篇进一步介绍scons的使用方法,主要介绍静态 ... -
使用scons替代makefile(3)
2011-01-25 11:55 4821在上两篇文章中已经简单介绍了用scons编译库文件,可执行程序 ... -
C 支持动态添加测试数据的测试代码
2011-01-13 17:22 1118/下面的定义为了支持可扩增。 //当需要增加一个新的测试用列 ... -
Linux下Makefile的automake生成
2010-12-28 16:55 1100******************helloworld.c* ... -
SCons笔记(详细版)
2010-12-23 16:11 105361. 基本使用 SConstruct文件就功能而言相当于Ma ... -
scons 学习
2010-12-23 11:14 2180scons 学习 作者:Sam(甄峰) sam_code@h ... -
scons随笔
2010-12-22 20:20 4706scons随笔 Scons是新一代的软件构件工具,或者说ma ... -
Scons在linux下的安装和使用
2010-12-21 11:59 3285因为正在用的一个开源软件需要的Developm ... -
UDP编程的服务器 Linux
2010-10-22 18:44 1336UDP编程的服务器端一般步骤是: ...
相关推荐
3. **C++中的组合实现** - 对于组合,可以使用回溯法或动态规划。回溯法是一种试探性的解决问题方法,当发现某一步选择不正确时,退回一步重新选择。 - 示例代码(回溯法): ```cpp void combination(int start...
下面将详细讨论PHP如何实现排列组合算法。 首先,排列和组合是离散数学中的基本概念。排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排列起来,形成不同的排列方式。组合则是指从n个不同元素中不考虑...
在C#编程中,排列组合算法是解决许多数学和计算机科学问题的基础,特别是在处理数据排序、统计计算以及算法设计时...无论哪种实现方式,理解和掌握排列组合的基本概念及其在C#中的实现,对于提升编程能力具有重要意义。
本篇我们将关注一种称为“插入算法”的排列组合实现。 首先,我们需要理解插入算法的基本思想。插入算法是一种基于回溯的策略,它从最简单的排列(如123...n)开始,然后通过插入一个尚未使用的元素来生成新的排列...
### Java中m取n排列组合实现 #### 一、背景介绍 在计算机科学中,排列组合是一个重要的概念,在很多算法设计中都会用到。比如密码学中的密钥生成、信息安全中的数据加密等场景都可能涉及到这一概念。在Java编程语言...
排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。
2. **业务逻辑层**:实现排列组合的生成算法,可能包括回溯法、动态规划或者Bitmask等高效策略。 3. **数据访问层**:通过Spring Data JPA或JdbcTemplate与H2数据库交互,存储和检索排列组合数据。 4. **筛选功能**...
在编程领域,排列组合是算法设计中的重要组成部分,特别是在数据结构和算法的课程中,以及在解决实际问题如路径搜索、图论问题等时经常用到。本资源深入讲解了如何在Java中实现这两种基本算法。 首先,让我们来理解...
总结来说,从n个数组中取出所有排列组合的Java实现涉及到递归算法、回溯法以及数据结构的操作。理解这些概念并能够熟练运用是成为一名优秀程序员的关键。通过这个例子,我们可以看到如何利用Java的灵活性和表达力来...
排列组合软件是一种用于生成所有可能的字符或关键字排列组合的工具,主要应用于数据分析、文本处理以及在本例中提到的电子商务领域,如淘宝直通车的关键词优化。这种软件可以帮助用户快速生成大量的组合,以便进行...
今天,我们将讨论基于C语言的排列组合算法实现。 一、全排列算法 全排列算法是指生成所有可能的排列的算法。常见的全排列算法有递归算法、分治算法和迭代算法等。在这里,我们将讨论基于C语言的递归算法实现。 1....
小小wintc程序 计算排列组合代吗 用递归写的 呵呵
本文将详细探讨如何使用C语言来实现排列组合算法,并结合递归解决P(m,n)问题。 首先,我们要理解排列和组合的基本概念。排列是指从n个不同元素中取出m个元素,按照一定的顺序进行排列,其数量由阶乘表示,即P(m,n) ...
### 基于Hadoop用并行递归实现排列组合运算 #### 背景介绍与问题描述 在计算机科学领域,数字排列组合是经典的算法问题之一,它不仅通俗易懂,而且对于初学者来说非常友好。通过这个问题的学习,我们可以很好地...
排列组合生成算法的python实现。实现方法参考了维基百科中的combination和permutation词条。 使用方法: python combinations.py #按字典序生成6中选3的组合(数字代码中可以调整) python arrangement.py #按字典序...
3. **算法实现**:在编程中,常用递归或动态规划方法实现排列组合的计算。例如,回溯法是一种常用的求解排列问题的算法,它通过尝试所有可能的分支并在不适合时回溯。而动态规划则常用于优化组合计数,避免重复计算...
排列组合是离散数学中的重要概念,主要研究的是在有限集合中进行无序或有序的选择问题。在本压缩包“排列组合练习数据”中,包含了相关的测试题目,旨在帮助学习者深入理解和掌握这一主题。排列关注的是元素的顺序,...
在本主题中,"易语言数字排列组合源码" 是一个关于使用易语言实现数字排列组合计算的代码示例。排列组合是组合数学中的基本概念,广泛应用于各种算法设计和数据分析中。 排列是指从n个不同元素中取出m(m≤n)个...
排列组合有重复 本资源主要讨论排列组合问题,特别是具有重复元素的排列组合...本资源的内容丰富、详细,涵盖了排列组合问题的定义、回溯算法的应用、实验设计和实现、实验结果和分析等方面的内容,供读者学习和参考。