C(m,n) 组合问题
dfs解决:注意:
- 第一次从main函数传来的参数是(0,1)
- 组合的第二个参数是start,dfs是循环开始的标记,这与排列不同
- 如果是已知m n的情况直接改函数中的m n的值
int way[30];//全局数组,记录每种方案
int n,m;//全局变量n,m,进行操作后求出的是C(m,n)
void zuhe_C(int cnt,int start) //首次在main函数从传来的参数是(0,1)
{
if(cnt==m) //当进入这个里面的时候已经排好了一种情况,可以在里面进行ans++或check等操作
{
for(int i=0;i<m;i++) cout<<way[i]<<' ';
puts("");
return;
}
for(int i=start;i<=n;i++)
{
way[cnt]=i;
zuhe_C(cnt+1,i+1); //dfs
way[cnt]=0; //恢复现场
}
}
A(m,n) 排列问题
dfs解决:注意:
- 第一次从main函数传来的参数是(0)
- 排列没有第二个参数,的标记,这与组合不同
- 如果是已知m n的情况直接改函数中的m n的值
int way[30];//全局数组,记录每种方案
int n,m;//全局变量n,m,进行操作后求出的是A(m,n)
bool st[15];//状态数组
void pailie_A(int cnt)
{
if(cnt==m)
{
for(int i=0;i<m;i++) cout<<way[i]<<' ';
puts("");
return;
}
for(int i=1;i<=n;i++)
{
if(!st[i])
{
st[i]=true;
way[cnt]=i;
pailie_A(cnt+1);
st[i]=false;//恢复现场
}
}
}
全排列A(n,n)的特殊解决方法:STL库函数
包含在< algorithm >头文件中的next_permutation()函数配合do while结构可以很方便地解决全排列问题。详见我的文章