一个排列组合问题的C++实现
网络分类-洗发水广告语
有一些装有铀和铅的箱子,数量足够多,把n个盒子放一行,至少有3个装有铅在一起,
共有多少种方法?
C++程序:分别用两种互补思路实现
#include
#include
int getN(int
m,int type,int c,int maxN);
int getM(int m,int
cc,int type=0,int c=0,int minM=0);
void
main()
{
int n;
cin>>n;
if
(n<3)
{
cout<<非法输入!
return
}
两种方法都行
直接法
int c3 =
getM(n-1,0,1,0,3)+getM(n-1,0,0,1,3);
取补法
int sum = (int)pow(2,n);总数
int c2 =
getN(n-1,1,0,2)+getN(n-1,0,1,2);至多有两个相邻的总数
cout<<种数:
}
int getM(int m,int
cc,int type,int c,int minM)
{
if (cc ==
1)
{
if (1 == m)
{
return
2;
}
else
{
return
getM(m-1,1)+getM(m-1,1);
}
}
if (1 == m)
{
if (c ==
minM-1)
{
return 1;
}
else
{
return 0;
}
}
else
{
if (c == minM-1)
{
return getM(m-1,1)+getM(m-1,0,1,0,minM);
}
else
{
return
getM(m-1,0,0,c+1,minM)+getM(m-1,0,1,0,minM);
}
}
}
int getN(int m,int
type,int c,int maxN)
{
if (1 == m)
{
if (c==maxN)
{
return 1;
}
else
{
return 2;
}
}
else
{
if (c==maxN) 是铅盒
{
return getN(m-1,1,0,maxN);
}
else
}
}
{
}
return
getN(m-1,1,0,maxN)+getN(m-1,0,c+1,maxN);