1、全排列问题
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10];
bool b[10]={false};
void pailie(int t){if(t==n){for(int i=0;i<n;i++){if(i>0){cout<<" ";}cout<<a[i];}cout<<endl;return;}for(int j=1;j<=n;j++){if(b[j]==false){a[t]=j;b[j]=true;pailie(t+1);b[j]=false;}}
}
int main(){cin>>n;pailie(0);return 0;
}
2、组合的输出
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[30];
bool b[30]={false};
void pailie(int p,int s){if(p==m){for(int i=0;i<m;i++){if(i>0){cout<<" ";}cout<<a[i];}cout<<endl;return;}for(int j=s;j<=n;j++){if(b[j]==false){a[p]=j;b[j]=true;pailie(p+1,j+1);b[j]=false;}}
}
int main(){cin>>n>>m;pailie(0,1);return 0;
}
3、字母有重复安排
#include<bits/stdc++.h>
using namespace std;
int n;
char a[15];
void pailie(int p){if(p==n){for(int i=0;i<n;i++){cout<<a[i];}cout<<endl;return;}for(int i=0;i<n;i++){char c='A'+i;a[p]=c;pailie(p+1);}
}
int main(){cin>>n;pailie(0);return 0;
}
4、有重复元素的排列问题
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
string cur;
bool b[500]={false};
int num=0;
void pailie(int p){if(p==n){cout<<cur<<endl;num++;return;}char c=0;for(int i=0;i<n;i++){if(!b[i]&&s[i]!=c){cur[p]=s[i];b[i]=true;c=s[i];pailie(p+1);b[i]=false;}}
}
int main(){cin>>n;cin>>s;sort(s.begin(),s.end());cur.resize(n);pailie(0);cout<<num<<endl;return 0;
}
5、 从前M个字母中取N个的无重复排列 [2*+]
#include<bits/stdc++.h>
using namespace std;
int n,m;
char a[15];
bool b[15]={false};
void pailie(int p){if(p==m){for(int i=0;i<m;i++){if(i>0){cout<<" ";}cout<<a[i];}cout<<endl;return;}for(int i=0;i<n;i++){if(!b[i]){a[p]='A'+i;b[i]=true;pailie(p+1);b[i]=false;}}
}
int main(){cin>>n>>m;pailie(0);return 0;
}
6、斐波那契数组
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100000;
int main(){int n;int a[MAXN];cin>>n;for(int i=0;i<n;i++){cin>>a[i];}if(n<=2){cout<<0<<endl;return 0;}int min=10000;for(int i=0;i<n;i++){int x=a[i];int num=0;if(a[0]!=x){num++;}if(a[1]!=x){num++;}int a_1=x;int a_2=x;for(int k=2;k<n;k++){int sum=a_1+a_2;if(a[k]!=sum){num++;}a_2=a_1;a_1=sum;}if(num<min){min=num;}}cout<<min<<endl;return 0;
}