P1149 火柴棒等式
可以证明,超过1000的数不可能满足条件,所以两个循环就可以解决问题。同时我们需要知道一个数所需要的火柴书。实际上就是这个数的每一位数字所需之和。题目很简单,就不再详细解释了。
#include<iostream>
using namespace std;
int b[10] = { 6,2,5,5,4,5,6,3,7,6 };
int ALL(int num) {
int all = 0;
int i = num;
for (; i != 0; i /= 10)
all += b[i % 10];
if (0 == num)
all += b[0];
return all;
}
int main()
{
int n;
cin >> n;
int sum = 0;
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if (ALL(i) + ALL(j) + ALL(i + j) + 4 == n)
sum++;
}
}
cout << sum;
return 0;
}
实际上,这道题亦可以写成搜索形式(超时了),代码如下:
#include<iostream>
using namespace std;
int b[10] = { 6,2,5,5,4,5,6,3,7,6 };
int sum = 0;
int ALL(int num) {
int all = 0;
int i = num;
for (; i != 0; i /= 10)
all += b[i % 10];
if (0 == num)
all += b[0];
return all;
}
int a[3];
int n;
void DFS(int level) {
if (3 == level) {
if (n == 4 && a[0] + a[1] == a[2])
sum++;
return;
}
for (int i = 0; i <= 1000; i++) {
if (n -= ALL(i)) {
a[level] = i;
}
DFS(level + 1);
n += ALL(i);
}
}
int main()
{
cin >> n;
DFS(0);
cout << sum;
return 0;
}