计蒜客 方程的解数 dfs

时间:2023-03-08 19:36:21

题目:

https://www.jisuanke.com/course/2291/182237

思路:

来自:https://blog.****.net/qq_29980371/article/details/76599695

dfs(int cnt, int curVal)//cnt是k,p的下标,curVal当前的和值
从1到m遍历进入dfs,然后不停dfs,进行查找,满足条件将结果加一,cnt临界就跳出循环,
 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
//计蒜客 方程的解数
int n, m, k[], p[], sum;
int poww[][];
void init()
{
//memset(poww, 1, sizeof(poww));
for (int i = ; i <= ; i++)
poww[i][] = ;
for (int i = ; i <= ; i++)
{
for (int j = ; j <= ; j++)
{
poww[i][j] = i*poww[i][j - ];
}
}
} void dfs(int cnt, int curVal)//cnt是k,p的下标,curVal当前的和值
{
if (cnt == n && curVal == )//满足方程式,sum++
{
sum++;
return;
}
if (cnt == n )//跳出循环
return;
for (int i = ; i <= m; i++)
{
dfs(cnt + , curVal + k[cnt] * poww[i][p[cnt]]);
}
} int main()
{
while (scanf("%d%d", &n, &m) == )
{
for (int i = ; i<n; i++)
scanf("%d%d", &k[i], &p[i]); sum = ;
init();
dfs(, );
printf("%d\n", sum);
}
return ;
}