P1149. 火柴棒等式

考点

  • DFS

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>

using namespace std;

int table[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}, arr[2], N, ans;

int cnt(int x)
{
int res = 0;
do
{
res += table[x % 10];
x /= 10;
} while (x);
return res;
}

void dfs(int idx, int sum)
{
if (sum > N - 4)
return;
if (idx > 1)
{
if (cnt(arr[0]) + cnt(arr[1]) + cnt(arr[0] + arr[1]) == N - 4)
++ans;
return;
}
for (int i = 0; i <= 1111; ++i)
{
arr[idx] = i;
dfs(idx + 1, sum + cnt(i));
}
}

int main()
{
cin >> N;
dfs(0, 0);
cout << ans;
return 0;
}

思路

题意实际上是问,两个数字及其和的组成火柴总数要等于N-4

除去加号与等号的四根火柴后,还剩20根;那么每个数字极限也只能到1111

当然上亿次的暴力搜索还是太大了,如果遍历过程中火柴数已经大于N-4就可以直接剪枝