考点
题解
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就可以直接剪枝