本题链接:P1149 [NOIP2008 提高组] 火柴棒等式 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意:
给定n个火柴棒,将火柴棒排成数字a、b、c,使得a+b=c,且这n个火柴棒要用完,求可以摆成几种情况
思路:
仍然为dfs应用,且为指数型,建立数组用于分别存储abc,重要的是进行多次剪枝,使得运行结果不超时
代码:
#include<iostream>
using namespace std;
int nums[10] = {6,2,5,5,4,5,6,3,7,6};
int n;
int res = 0;
int dig[5];
int cal(int n) {
if (n < 10) return nums[n];
int ress = 0;
while (n) {
ress += nums[n % 10];
n /= 10;
}
return ress;
}
void dfs(int index,int sum) {
if (sum > n) return;
if (index == 3 && dig[0] + dig[1] == dig[2] && (cal(dig[0]) + cal(dig[1]) + cal(dig[2]) == n)) {
res++;
return;
}
if (index >= 3) return;
for (int i = 0; i < 800; i++) {
if (cal(i) > n) continue;
dig[index] = i;
dfs(index + 1,sum + cal(i));
}
}
int main() {
cin >> n;
n -= 4;
dfs(0,0);
printf("%d", res);
return 0;
}