首页 > 编程知识 正文

组合排列问题方法,组合排列问题例题

时间:2023-05-03 17:04:25 阅读:194002 作者:4966

 

组合排列问题:复杂度为O(m*n)实现原理:递归,这种做法有点类似于遍历,就是k不断从1增长到m,每一个p(k)又从a[1]到a[n]中去遍历。其实在复杂度上面递归并没有提升效率,和双重循环递推一样的。但是更易于理解,可读性强,代码少。看下一张图可能能加深理解(红色的m改成n,写错了)。

/* 全排列问题 从n中选m个数按照字典排序 */#include<iostream>#include<vector>#include<algorithm>#include<cstring>int s=0;int m,n;int a[100];using namespace std;int main(){int P(int k); //k从 1 一直增长到 m ,k表示排列的第k个数 cin>>n>>m;P(1);return 0;}int P(int k){if(k>m) //如果 k 要比m还要长则停止递归 return s;for(int i=1;i<=n;i++){a[k]=i;int flag=0;for(int j=1;j<=k-1;j++) //这里表示 每一位例如第2位 要试探n个数,前面出现的就不要。 {if(a[k]==a[j]){flag=1;break; }}if(flag==0) //flag==1 表示前面已经用了那个数,就不能用了。 {if(k==m)// 当k已经到了第m位,那就要输出这个全排列了 {for(int i=1;i<=m;i++){printf("%d",a[i]);}printf("n");s++; //s统计排列个数 }elseP(k+1);//k还没到达m位,那就继续寻找下一位。 }}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。