回文子序列
输入一个字符串,输出回文子序列的个数
#include <bits/stdc++.h>
using namespace std;
string str;
string b;
int n,ans=0;
void dfs(int i){
if(i>=n){
string c=b;
reverse(c.begin(),c.end());
ans+=(c==b);
return ;
}
dfs(i+1);
b+=str[i];
dfs(i+1);
b.pop_back();
}
int main()
{
int i;
cin>>str;
n=str.size();
dfs(0);
cout<<ans-1;
return 0;
}
全排列
输出1到n的全排列
#include<bits/stdc++.h>
using namespace std;
int a[105],b[105];int n;
void dfs(int st){
if(st>=n+1){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++){
if(b[i]==0){
b[i]=1;
a[st]=i;
dfs(st+1);
b[i]=0;
}
}
}
int main(){
cin>>n;
dfs(1);
return 0;
}
整数分解
给定一个正整数n,将其恰好分成k个数,使其和等于n,要求输出方案数(忽略顺序)以及每一个方案数(按字典序排列)
#include <bits/stdc++.h>
using namespace std;
int n,k;
int ans=0;
int a[1005];
void dfs(int s,int t){
if(t==k){
if(s==n){
for(int j=0;j<t-1;j++){
cout<<a[j]<<"+" ;
}
cout<<a[t-1]<<"="<<s<<endl;
ans++;
}
return ;
}
for(int i=1;i<=n-s;i++){
a[t]=i;
if(i>=a[t-1]){
dfs(s+i,t+1);
}
}
}
int main()
{
cin>>n>>k;
dfs(0,0);
cout<<ans;
return 0;
}