C语言排列组合问题,急急急!
从7种颜色中选n种,要求:红色必须有,蓝绿不能同时选。问有多少种选法?7色:A~G(红色为A,蓝色为E,绿色为D)如:输入:6输出:ABCDFGABCEFGTotal=2...
从7种颜色中选n种,要求:红色必须有,蓝绿不能同时选。问有多少种选法?
7色:A~G(红色为A,蓝色为E,绿色为D)
如:输入:6
输出:ABCDFG
ABCEFG
Total=2 展开
7色:A~G(红色为A,蓝色为E,绿色为D)
如:输入:6
输出:ABCDFG
ABCEFG
Total=2 展开
展开全部
既然红色必须有,那就可以把问题简化为在六种颜色中选,即BCDEFG.
那蓝绿不能同时选,那只需要一个判断条件就可以啦,
这个需要用到回溯法(递归求解)
下面给你一些思路
//代表7种颜色,初始为0,表示没有被选中,1代表被选中
int color[7]={1,0,0,0,0,0,0};
//i表示正在判断第i个颜色是否被选取,n表示要选择n种
void powerset(int i,int n){
if(i>7){
//如果在color数组中有n个元素是1,且color[3]和color[4]不同时为1 //则输出数组中所有为1的元素
}
else{
取第i个元素;
powerset(i+1,n);
舍第i个元素;
powerset(i+1,n);
}
}
展开全部
代码如下:
#include <stdio.h>
char color[]={'A','B','C','D','E','F','G'};
char output[8]={'A',0};
int count=0;
int checkDE(void)
{
int i,j=0;
for(i=0;i<strlen(output);i++)
{
if((output[i]=='D')||(output[i]=='E'))
{
j++;
}
}
if(j>1)
{
return -1;
}
return 0;
}
void getCount(char *in,char *out, int number, int select)
{
int i;
if (select==1)
{
for(i=0;i<number;i++)
{
out[0]=in[i];
if(checkDE()==0)
{
printf("%s\n",output);
count++;
}
}
}
else
{
for(i=0;i<number;i++)
{
out[0]=in[i];
getCount(in+i+1, out+1, number-i-1, select-1);
}
}
return;
}
int main()
{
int n;
printf("input n: ");
scanf("%d", &n);
if(n>7)
{
return 0;
}
if(n<=1)
{
printf("%s\n",output);
printf("Total=1\n");
}
else
{
getCount(&color[1],&output[1],6,n-1);
printf("Total=%d\n",count);
}
return 0;
}
#include <stdio.h>
char color[]={'A','B','C','D','E','F','G'};
char output[8]={'A',0};
int count=0;
int checkDE(void)
{
int i,j=0;
for(i=0;i<strlen(output);i++)
{
if((output[i]=='D')||(output[i]=='E'))
{
j++;
}
}
if(j>1)
{
return -1;
}
return 0;
}
void getCount(char *in,char *out, int number, int select)
{
int i;
if (select==1)
{
for(i=0;i<number;i++)
{
out[0]=in[i];
if(checkDE()==0)
{
printf("%s\n",output);
count++;
}
}
}
else
{
for(i=0;i<number;i++)
{
out[0]=in[i];
getCount(in+i+1, out+1, number-i-1, select-1);
}
}
return;
}
int main()
{
int n;
printf("input n: ");
scanf("%d", &n);
if(n>7)
{
return 0;
}
if(n<=1)
{
printf("%s\n",output);
printf("Total=1\n");
}
else
{
getCount(&color[1],&output[1],6,n-1);
printf("Total=%d\n",count);
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询