组合
来源:互联网 发布:解除用户mac地址绑定 编辑:程序博客网 时间:2024/05/17 03:32
在n个数中,求其中r个数的所有组合
算法思想
当组合的第一个数字选定后,其后的数字是从余下的n-1个数中取r-1个数的组合。这就将求n个数中取r个数的组合问题转化成求n-1个数求r-1个数的组合问题。引入工作数组a[]存放求出的组合,约定函数将确定的r个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[]中的一个组合输出。第一个数可以是n、n-1、.......r,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未确定组合的其余元素,继续递归去确定;或因已确定了组合的全部元素,输出这个组合。
#include<stdio.h>
#define nn 100
int a[nn];
void comb(int m,int k) //m个数中k个数的所有组合
{
int i,j;
for (i=m;i>=k;i--)
{
a[k]=i; // 选择第一个数
if (k>1)
comb(m-1,k-1);
else
{
for (j=a[0];j>0;j--)
printf("%4d",a[j]);
printf("/n");
}
}
}
void main()
{
int n,r;
printf("entry n,r:");
scanf("%d,%d",&n,&r);
a[0]=r; //控制输出(组合中)数字的个数
comb(n,r);
}
上面那个算法都是先选择n,在n-1
而下面这个算法则相反,它先选择1,再2
#include<stdio.h>
#define nn 10
int n,r;
int a[nn],k;
void comb(int s,int j){
int i;
for(i=s;i<=n-j+1;i++){
a[r-j]=i; //选择第r-j(0,1,...)数
if(j>1)
comb(i+1,j-1);
else{
for(k=0;k<r;k++)
printf("%4d",a[k]);
printf("/n");
}
}
}
int main(void){
printf("n,r:");
scanf("%d,%d",&n,&r);
comb(1,r);
}
个人感觉还是第一个容易懂些(呵呵,本人还是个大菜鸟)
总结:
在刚开始写算法的时候,在考虑选择第一个数的时候想了老半天(没有想到用循环来选择)
还有很多要很多学习啊!!!
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- 组合
- iframe经典用法
- Creating a View on a Dialog
- JAVA开发者最常去的20个英文网站
- oracle 启动管理器
- mkyaffs2image工具解析
- 组合
- ADB remote Debug Android App on G1 (Through WiFi)
- 想成为嵌入式程序员应知道的0x10个基本问题
- SEO学习搜索引擎的历程
- JavaScript比较两个数组相等
- FORCAL扩展动态库之Windows窗口库FcWin
- UBUNTU OPENSSH APACHE 小知识
- ORACLE 9i 统计表
- Permission denied 与 553 Permission denied 错误解决方法