0
已采纳
方法1:
//1. 排列
int ans[1010];
bool used[1010];
void DFS(int t){
if(t>r){//r表示排列的元素数量
//1~n的r个元素的排列已经生成
return;
}
for(int i=1;i<=n;i++){
if(used[i]==0){
ans[t]=i;
used[i]=true;
DFS(t+1);
used[i]=false;
}
}
}
主函数内调用:DFS(1)
//2. 组合
int ans[1010];
bool used[1010];
void DFS(int t,int last){
if(t>r){//r表示排列的元素数量
//1~n的r个元素的组合已经生成
return;
}
for(int i=last+1;i<=n;i++){
if(used[i]==0){
ans[t]=i;
used[i]=true;
DFS(t+1,i);
used[i]=false;
}
}
}
主函数内调用:DFS(1,0)
方法2(只有排列,没有组合)
头文件:
#include <algorithm>
主体框架:
int a[1010];
do{
for(int i=1;i<=r;i++){
//1~n的r个元素的排列生成了
//若r是n,则是全排列
//若r不是n,则会有重复
}
}while(next_permutation(a+1,a+1+n));
0
很简单:
一维数组:
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++{
if(a[i]>a[j]){
swap(a[i],a[j]);
}
}
}
0
很简单:
一维数组:
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++{
if(a[i]>a[j]){
swap(a[i],a[j]);
}
}
}
0
0
0
用循环就能搞定
for(i(1--n)){
for(int j(i+1--n){
if(a[i]大于(小于)a[j])
swap(a[i],a[j]);
}
}
或者用sort
一条语句
sort(a+1,a+1+n,cmp);
a是数组名
n是数字个数
cmp要看情况加,这个是排序规律
0
用循环就能搞定
for(i(1--n)){
for(int j(i+1--n){
if(a[i]大于(小于)a[j])
swap(a[i],a[j]);
}
}
或者用sort
一条语句
sort(a+1,a+1+n,cmp);
a是数组名
n是数字个数
cmp要看情况加,这个是排序规律,而且是bool
0
排列组合课后讲义
一、什么是全排列
定义:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
比如3的全排列就是
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
有六种不同的排列顺序
n个数字的全排列有:n!个。
如何思考这一类问题?
1、n个数字的全排列,看成有n个位置,我们从第一个位置到第n个位置来填数字
2、第一个位置,有n个选择, 第二个位置,不能选择和第一个位置相同的数,有n-1个选择, 第三个位置,不能选择和前两个位置相同的数,有n-2个选择…
(课堂题代码就不发了)
