#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
static int visited[200] = { 0 }, ans, n, M, p[200];
static double k[200];
double power(int x, int y)
{
double val = 1.0;
while (y--)
val = val * x;
return val;
}
void dfs(int m, double sum)
{
int i, x;
if (m > n || m == n && sum != 0) //第一步:判断
return;
if (m == n && sum == 0)
{
ans++;
return;
}
for (x = 1; x <= M; x++)
{
sum += k[m] * power(x, p[m]); //第二步:对当前节点的某一种可能性进行操作
dfs(m + 1, sum); //第三步:针对该种可能性,作为既定基础,递归dfs
sum -= k[m] * power(x, p[m]); //第四步:放弃当前节点的这种可能性,通过循环,对当前节点的下一种可能性进行操作
}
}
int main()
{
int i, j;
cin >> n >> M;
for (i = 0; i < n; i++)
cin >> k[i] >> p[i];
memset(visited, 0, 200);
dfs(0, 0);
cout << ans;
return 0;
}
大致思路就是代码的注释四部曲。
【蓝桥杯-dfs】方程的解数(含dfs重要思路)
最新推荐文章于 2024-01-29 18:43:12 发布