Acwing 1209. 带分数
题目链接:1209. 带分数 - AcWing题库
标签:递归
思路:先枚举出1~9的全排列,可将全排列分为三段,分别作为a,b,c的取值。判断该a,b,c的值是否满足条件。
注意点:a,b,c都不能为0。
AC代码:
#include<iostream>
using namespace std;
int A[3628811][10];
bool vis[15];
int num[15];
int cnt=1;
void dfs(int u)//求全排列
{
if(u>9)
{
for(int i=1;i<10;++i)
{
A[cnt][i]=num[i];
}
cnt++;
return;
}
for(int i=1;i<10;++i)
{
if(vis[i]==false)
{
num[u]=i;
vis[i]=true;
dfs(u+1);
vis[i]=false;
}
}
}
int main()
{
int n;
int a,b,c;
int ans=0;
cin>>n;
dfs(1);
for(int i=1;i<=cnt;++i)
{
for(int j=1;j<10;++j)
{
//求a
a=0;
for(int t=1;t<=j;++t)
{
a*=10;
a+=A[i][t];
}
//如果a>n,不满足条件,剪枝
if(a>n) break;
for(int k=1;k<10;++k)
{
//求b
b=0;
for(int t=1;t<=k;++t)
{
b*=10;
b+=A[i][t+j];
}
//求c
c=0;
for(int t=1;t<=9-j-k;++t)
{
c*=10;
c+=A[i][t+j+k];
}
if(c<=0) break;//防止除0
//判断
if(a+b/c==n&&b%c==0&&b!=0) {
ans++;
}
}
}
}
cout<<ans<<endl;
return 0;
}
Acwing 93. 递归实现组合型枚举
AC代码:
#include<iostream>
using namespace std;
int n,m;
bool vis[100];
void dfs(int u,int cnt)
{
if(cnt==m)
{
for(int i=1;i<=n;++i) if(vis[i]) cout<<i<<" ";
cout<<endl;
return;
}
else if(u>n) return;
vis[u]=true;
dfs(u+1,cnt+1);
vis[u]=false;
dfs(u+1,cnt);
}
int main()
{
cin>>n>>m;
dfs(1,0);
return 0;
}
Acwing 717. 简单斐波那契
AC代码:
#include<iostream>
using namespace std;
int f(int x)
{
if(x==0) return 0;
if(x==1||x==2) return 1;
return f(x-2)+f(x-1);
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;++i)
{
cout<<f(i)<<" ";
}
return 0;
}