c语言按条件求组合数问题

lwhger 2012-10-17 04:22:10
#include <stdio.h>
#include <stdlib.h>
/*
*这个函数的功能是从n个数中选取m个数来排列,并且打印出符合条件的结果(即每组中1,2,3中最少有1至2个,没有包括号1,2,3都有的)
*数组a是等选取的原始数据,数组b用来保存中间结果,M用来控制打印的参数,count所指向的地址保存符合条件的组合的个数
*/
void combine( int a[], int n, int m, int b[], int M ,int *count)
{
int i,j,t;
for(i=n; i>=m; i--)
{
b[m-1] = i - 1;
if (m > 1)
combine(a,i-1,m-1,b,M,count);
else
{
t=0;
for(j=M-1; j>=0; j--)
if(a[b[j]]==1||a[b[j]]==2||a[b[j]]==3)
t++;
if(t!=1&&t!=2)//判断包括1,2,3中的1个或者2个的组合
continue;
for(j=M-1; j>=0; j--)
printf("%02d ",a[b[j]]);//打印出符合条件的组合

printf("\n");
*count=(*count)++;
}
}
}
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,10,11};
int b[11];
static int count=0;
combine(a,11,5,b,5,&count);//11选5
printf("count=%d\n",count);//打印出符合条件的个数
system("pause");
return 0;
}


如果把条件(即每组中1,2,3中最少有1至2个,没有包括号1,2,3)改成每组中必须包含1,而每组中2和3必须有其中的一个
(即每组中必须含有1-2或1-3)具体点怎么改???????
...全文
485 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
newtee 2012-10-18
  • 打赏
  • 举报
回复
求分享下解决方案
newtee 2012-10-17
  • 打赏
  • 举报
回复
或许原数组变了 你的方法就不管了 下午上课前看了下楼主的程序
newtee 2012-10-17
  • 打赏
  • 举报
回复
怎么解决的?
赵4老师 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
自己已解决,我的分怎么办?????
[/Quote]
给我!(^_^)
赵4老师 2012-10-17
  • 打赏
  • 举报
回复
zhfilter.c
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m, int n)
{
int i,j,a,b,c,ch;

for (i = m; i >= n; i--) {
comb[n] = i; /* 选择当前的“头”元素 */
if (n > 1){
/* 进入下一次更小的组合问题 */
combination(i - 1, n - 1);
}else{
/* 需要的组合数 */

/*每组中必须包含A,而每组中B和C必须有且仅有其中的一个*/
a=0;
b=0;
c=0;
for (j = comb[0]; j > 0; j--) {
ch=65+c1-comb[j];
if (ch=='A') a=1;
if (ch=='B') b=1;
if (ch=='C') c=1;
}
if ((a==1 && b==1 && c==0)
||(a==1 && b==0 && c==1)) {
/*输出*/
for (j = comb[0]; j > 0; j--) {
printf("%c", 65+c1-comb[j]);
}
printf("\n");
}
}
}
return;
}
int main(int argc, char *argv[])
{
if (argc<3) {
printf("%s 组合下标 组合上标\n",argv[0]);
return 0;
}
c1=atoi(argv[1]);
if (c1<1||26<c1) {
printf("1<=组合下标<=26\n");
return 0;
}
c2=atoi(argv[2]);
if (c2<1||c1<c2) {
printf("1<=组合上标<=组合下标\n");
return 0;
}
comb[0]=c2;
combination(c1, c2); /* C(4, 2) */
return 0;
}
//C:\mydir>zhfilter 11 5
//ABDEF
//ABDEG
//ABDEH
//ABDEI
//ABDEJ
//ABDEK
//ABDFG
//ABDFH
//ABDFI
//ABDFJ
//ABDFK
//ABDGH
//ABDGI
//ABDGJ
//ABDGK
//ABDHI
//ABDHJ
//ABDHK
//ABDIJ
//ABDIK
//ABDJK
//ABEFG
//ABEFH
//ABEFI
//ABEFJ
//ABEFK
//ABEGH
//ABEGI
//ABEGJ
//ABEGK
//ABEHI
//ABEHJ
//ABEHK
//ABEIJ
//ABEIK
//ABEJK
//ABFGH
//ABFGI
//ABFGJ
//ABFGK
//ABFHI
//ABFHJ
//ABFHK
//ABFIJ
//ABFIK
//ABFJK
//ABGHI
//ABGHJ
//ABGHK
//ABGIJ
//ABGIK
//ABGJK
//ABHIJ
//ABHIK
//ABHJK
//ABIJK
//ACDEF
//ACDEG
//ACDEH
//ACDEI
//ACDEJ
//ACDEK
//ACDFG
//ACDFH
//ACDFI
//ACDFJ
//ACDFK
//ACDGH
//ACDGI
//ACDGJ
//ACDGK
//ACDHI
//ACDHJ
//ACDHK
//ACDIJ
//ACDIK
//ACDJK
//ACEFG
//ACEFH
//ACEFI
//ACEFJ
//ACEFK
//ACEGH
//ACEGI
//ACEGJ
//ACEGK
//ACEHI
//ACEHJ
//ACEHK
//ACEIJ
//ACEIK
//ACEJK
//ACFGH
//ACFGI
//ACFGJ
//ACFGK
//ACFHI
//ACFHJ
//ACFHK
//ACFIJ
//ACFIK
//ACFJK
//ACGHI
//ACGHJ
//ACGHK
//ACGIJ
//ACGIK
//ACGJK
//ACHIJ
//ACHIK
//ACHJK
//ACIJK
lwhger 2012-10-17
  • 打赏
  • 举报
回复
自己已解决,我的分怎么办?????
十八道胡同 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

谢谢参与,已解决
[/Quote]

很多次我也碰到这种问题,发帖前想了很久想不出来,一发帖整理,问题就找到了。。
lwhger 2012-10-17
  • 打赏
  • 举报
回复
谢谢参与,已解决
dpdp_2012 2012-10-17
  • 打赏
  • 举报
回复
a数组里数字能重复?
dpdp_2012 2012-10-17
  • 打赏
  • 举报
回复
a数组里保存的都是<10的数字?肯定包括1,2,3?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧