全排列模型
n选n全排列
#include <iostream>
using namespace std;
string s;
const int N=1e5+10;
bool vis[N];
char cnt[N];
void dfs(int depth){//状态 正在搜索第depth层,搜索到了就搜下一层
//5.终止条件
if(depth>=s.size()+1){
for(int i=1;i<=depth-1;i++){
cout<<cnt[i];
}cout<<endl;
return;
}
//1.枚举方案数
for(int i=0;i<s.size();i++){
//2.判断是否需要标记
if(!vis[i]){
//3.搜索
vis[i]=1;
cnt[depth]=s[i];
dfs(depth+1);
//4.回溯
vis[i]=0;
}
}
}
int main(){
cin>>s;
dfs(1);//初态是第一层
return 0;
}
n选r全排列
#include <iostream>
using namespace std;
string s;
int r;
const int N=1e5+10;
bool vis[N];
char cnt[N];
void dfs(int depth){//状态 正在搜索第depth层,搜索到了就搜下一层
//5.终止条件
if(depth>=r+1){
//打印原则 搜多少打多少
for(int i=1;i<=depth-1;i++){
cout<<cnt[i];
}cout<<endl;
return;
}
//1.枚举方案数
for(int i=0;i<s.size();i++){
//2.判断是否需要标记
if(!vis[i]){
//3.搜索
vis[i]=1;
cnt[depth]=s[i];
dfs(depth+1);
//4.回溯
vis[i]=0;
}
}
}
int main(){
cin>>s>>r;
dfs(1);//初态是第一层
return 0;
}
组合模型
n选r组合模型
#include <iostream>
using namespace std;
string s;
int r;
const int N=1e5+10;
bool vis[N];
char cnt[N];
void dfs(int depth){//状态 正在搜索第depth层,搜索到了就搜下一层
//5.终止条件
if(depth>=r+1){
//打印原则 搜多少打多少
for(int i=1;i<=depth-1;i++){
cout<<cnt[i];
}cout<<endl;
return;
}
//1.枚举方案数
for(int i=0;i<s.size();i++){
//2.判断是否需要标记
if(!vis[i]&&s[i]>cnt[depth-1]){
//3.搜索
vis[i]=1;
cnt[depth]=s[i];
dfs(depth+1);
//4.回溯
vis[i]=0;
}
}
}
int main(){
cin>>s>>r;
dfs(1);//初态是第一层
return 0;
}
自然数的拆分
#include <iostream>
using namespace std;
string s;
int n,r,sum;
const int N=1e5+10;
bool vis[N];
int cnt[N];
void dfs(int depth,int sum){//状态 正在搜索第depth层,搜索到了就搜下一层
//5.终止条件
if(sum>n)return;
if(sum==n){
//打印原则 搜多少打多少
printf("7=");
for(int i=1;i<=depth-2;i++){
printf("%d+",cnt[i]);
}printf("%d\n",cnt[depth-1]);
return;
}
//1.枚举方案数
for(int i=1;i<=n-1;i++){
//2.判断是否需要标记
//3.搜索
if(i>=cnt[depth-1]){
cnt[depth]=i;
dfs(depth+1,sum+i);
//4.回溯
}
}
}
int main(){
//5选3组合
cin>>n;
dfs(1,sum);//初态是第一层
return 0;
}
#include <iostream>
#include <vector>
#include <climits>
#include <string>
#define int long long
using namespace std;
const int N=30;
int n,k,a[N],ans,vis[N];
bool IsPrime(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0) return false;
}
return true;
}
void dfs(int sum,int depth,int start){
if(depth>k){
if(IsPrime(sum)){
ans++;
return;
}
return;
}
for(int i=start;i<=n;i++){
if(!vis[i]){
vis[i]=1;
dfs(sum+a[i],depth+1,i);
vis[i]=0;
}
}
}
signed main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(0,1,1);
cout<<ans<<endl;
return 0;
}