【算法】 组合数问题非递归解法
2014-04-22 11:18
302 查看
描述 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
输入 输入n、r。 输出 按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。 样例输入
样例输出
输入 输入n、r。 输出 按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。 样例输入
5 3
样例输出
543 542 541 532 531 521 432 431 421 321
<span style="font-size:18px;">#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 1000 int cmp(const void *a,const void *b); int main() { int i = 0; int j = 0; int n = 0; int r = 0; int k = 0; int data[10]; int num[10] = {1,2,3,4,5,6,7,8,9}; int result[MAX_LEN]; scanf("%d %d",&n,&r); memset(result,0,sizeof(result)); for (i = 0; i < (1<<n); i++) { int m = 0; int numdex = 0; memset(data,0,sizeof(data)); for (j = 0; j < n; j++) { if (i & (1<<j)) { data[numdex++] = num[j]; } } if (numdex == r) { int tmp = 0; for (m = numdex-1; m >= 0; m--) { tmp = tmp * 10 + data[m]; } result[k++] = tmp; } } qsort(result,k,sizeof(result[0]),cmp); for (k = k-1; k >= 0; k--) { printf("%d\n",result[k]); } return 0; } int cmp(const void *a,const void *b) { return *((int *)a) - *((int *)b); } </span>
相关文章推荐
- [算法]简单的背包问题递归解法,C语言实现
- [算法]数据结构算法背包问题解法之递归解法,C语言实现
- 北大 算法 2.4 递归 汉诺塔问题手工解法以及编译过程
- 算法学习记录 N皇后问题 递归解法
- 算法学习-组合问题递归解法
- 汉诺斯塔问题递归解法
- 【问题】:进制转化算法(迭代版&递归版)
- 八皇后问题解法及算法分析
- 算法——递归思想解决排列组合问题
- 算法系列之五:最长公共子序列(LCS)问题(非连续子序列)的两种解法
- 算法设计关于递归方程T(n)=aT(n/b)+f(n)之通用解法
- 递归和分治思想4|八皇后问题 - 数据结构和算法34
- 李洋疯狂C语言之用递归解决李白喝酒问题(附填空题解法)
- 全排列问题问题的两种算法--递归与字典序
- 01背包问题(当有的背包重量是非整数时)的递归(优化成动态规划+再用滚动数组优化)解法+一些动态规划(递归,搜索)的高级技巧
- 常见递归问题 Python解法
- 算法学习之递归--汉诺塔问题
- 7592:求最大公约数问题(2.2基本算法之递归和自调用函数)
- 算法——递归思想解决排列组合问题
- 汉诺塔问题的递归解法