排列组合算法
2013-07-05 19:14
232 查看
1.排列算法
#include <stdio.h> #define MAX_NUM 100 void print(int n, int * num) { int i; for (i = 0; i < n; ++i) printf("%d ", num[i]); printf("\n"); } void swap(int * a, int * b) { int c = *a; *a = *b; *b = c; } int _arrange(int i, int n, int * num) { int count = 1; print(n, num); while (i < n) { int j = i; while (++j < n) { swap(num + i, num + j); count += _arrange(i + 1, n, num); swap(num + i, num + j); } ++i; } return count; } int combination(int up, int down) { int i, j, count = 0; int num[MAX_NUM]; for (i = 0; i < up; ++i) num[i] = i; i = up - 1, j = up; while (1) { if (num[0] > down - up) break; if (num[i] > down - up + i) { --i; } else if (i == up - 1) { print(up, num); ++num[i]; ++count; } else { ++num[i]; while (i < up - 1) { ++i; num[i] = num[i - 1] + 1; } } } return count; } int arrange(int up, int down) { int i, j, count = 0; int num[MAX_NUM]; for (i = 0; i < up; ++i) num[i] = i; i = up - 1, j = up; while (1) { if (num[0] > down - up) break; if (num[i] > down - up + i) { --i; } else if (i == up - 1) { count += _arrange(0, up, num); ++num[i]; } else { ++num[i]; while (i < up - 1) { ++i; num[i] = num[i - 1] + 1; } } } return count; } int main() { //combination(9, 10); printf("count:%d\n", arrange(6, 6)); getch(); return 0; }
[/code]
2.组合算法
#include <stdio.h> #define MAX_NUM 100 void print(int n, int * num) { int i; for (i = 0; i < n; ++i) printf("%d ", num[i]); printf("\n"); } void swap(int * a, int * b) { int c = *a; *a = *b; *b = c; } int _arrange(int i, int n, int * num) { int count = 1; print(n, num); while (i < n) { int j = i; while (++j < n) { swap(num + i, num + j); count += _arrange(i + 1, n, num); swap(num + i, num + j); } ++i; } return count; } int combination(int up, int down) { int i, j, count = 0; int num[MAX_NUM]; for (i = 0; i < up; ++i) num[i] = i; i = up - 1, j = up; while (1) { if (num[0] > down - up) break; if (num[i] > down - up + i) { --i; } else if (i == up - 1) { print(up, num); ++num[i]; ++count; } else { ++num[i]; while (i < up - 1) { ++i; num[i] = num[i - 1] + 1; } } } return count; } int arrange(int up, int down) { int i, j, count = 0; int num[MAX_NUM]; for (i = 0; i < up; ++i) num[i] = i; i = up - 1, j = up; while (1) { if (num[0] > down - up) break; if (num[i] > down - up + i) { --i; } else if (i == up - 1) { count += _arrange(0, up, num); ++num[i]; } else { ++num[i]; while (i < up - 1) { ++i; num[i] = num[i - 1] + 1; } } } return count; } int main() { //combination(9, 10); printf("count:%d\n", arrange(3, 3)); getch(); return 0; }
[/code]
如:combination(3,4); 输出: 123 124 134 234 也就是{1,2,3,4}组合4取3的结果 如arrange(3,4) 输出: 123 132 231 213 312 321 124 142 214 241 412 421 ...
相关文章推荐
- {C语言算法}排列组合
- 2015创发科技校园招聘笔试题——排列和组合的算法实现
- java排列组合算法(n选n)
- 字符串的全排列和组合算法
- C#实现排列组合算法
- 算法练习:排列组合之翻译手机号码
- 算法之排列与组合算法
- 关于排列组合算法的心得
- 排列组合与回溯算法
- 排列组合算法题目
- 全排列算法与全组合算法
- 数组排列组合算法汇总
- C递归版的全排列和组合算法
- 从0到9取4位不同数字的排列组合算法
- 一种简单而神奇的算法思路:分级组合(排列)法
- js交叉排列的组合算法
- 【算法总结-排列组合与子集问题】排列组合与子集问题
- 有人机交互能力的排列组合算法(C++版)
- 生成{1,2,...,n}的排列的算法-组合数学
- 算法之排列与组合算法