说到排列组合问题,至今还让大家耳目一新记忆犹新釜底抽薪的题目有:全排列啊、组合的输出啊等等等等;今天就让我们来探索一下入门后,继全排列后排列组合第二关————n个数中取r个数的全排列
题目分析:先把排列模板打好:
#include<bits/stdc++.h>
using namespace std;
int vis[20];
int ans[20];
int n;
void dfs(int t){
if(t>n){
for(int i=1;i<=n;i++){
printf("%d",ans[i]);
}
printf("\n");
return;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
ans[t]=i;
vis[i]=1;
dfs(t+1);
vis[i]=0;
}
}
}
int main(){
scanf("%d",&n);
int x=1;
for(int i=n;i>0;i--){
x*=i;
}
printf("%d\n",x);
dfs(1);
return 0;
}//因为我是新手,不会在这里面打缩进,所以就将就吧,请大神教下小弟
这道题不就是比全排列多了一个r范围吗,在原代码上修改:
#include<bits/stdc++.h>
using namespace std;
int a[15],ans=0,n,r;
bool vis[15];
void print(){
ans++;
for(int i=1;i<=r-1;i++){
printf("%d ",a[i]);
}
printf("%d\n",a[r]);
}
void dfs(int len){
for(int i=1;i<=n;i++){
if(!vis[i]){
a[len]=i;
vis[i]=1;
if(len==r){
print();
}
else{
dfs(len+1);
}
vis[i]=0;
}
}
}
int main(){
scanf("%d %d",&n,&r);
dfs(1);
printf("%d",ans);
return 0;
}
突然想起什么!
题目忘加了!
不慌,补上:
问题 A: n个数中取r个数的全排列
时间限制: 1 Sec
内存限制: 128 MB
提交: 145 解决: 109
题目描述:
设n个整数的集合{1,2,3,n},从中取出r个进行排序,输出排序结果。
输入一行:两个正整数 n 和 r (r<n<10)。
输出字典序从小到大的全排列及全排列的总个数。
样例输入
3 2
样例输出
1 2
1 3
2 1
2 3
3 1
3 2
6
最后问一下:你听懂了吗?求给个赞!!!