本篇文章主要是博主进行的一些递归与递推的题目练习,比较适合新手小白,后续还会对本篇文章的题目和代码进行补充
1、带分数
本质:递归实现排列型枚举
题目信息
思路
题解
//带分数
#include <bits/stdc++.h>
#define int long long
#define maxsize 100
using namespace std;
int cnt=0;//记录有多少种方法
int number[maxsize];//记录全排列的结果
int flag[maxsize];//记录是否被用过
int n;//等式左边的数
//将切割出来数组中的数转换成十进制的数字
int num(int l,int r)
{
int result=0;
for(int i=l;i<=r;i++)
{
result=result*10+number[i];
}
return result;
}
void dfs(int u)//u指全排列当前所在的位数
{
if(u>9)
{
int a,b,c;
//枚举a、b、c的位数
for(int i=1;i<=7;i++)
{
for(int j=i+1;j<=8;j++)
{
a=num(1,i);
b=num(i+1,j);
c=num(j+1,9);
//判断a,b,c是否与n相等
if(n*c==a*c+b)
{
cnt ++;
}
}
}
return;
}
for(int i=1;i<=9;i++)
{
if(flag[i]==0)
{
flag[i]=1;
number[u]=i;
dfs(u+1);
flag[i]=0;//恢复现场
}
}
}
signed main()
{
cin>>n;
dfs(1);
cout<<cnt;
return 0;
}
本题博主采用的是暴力求解,也是比较容易想到和理解的方法,没有考虑时间复杂度、代码优化等等。
2、翻硬币
题目信息
思路
题解
3、飞行员兄弟
题目信息
思路
题解
4、费解的开关
题目信息