P1149 火柴棒等式

P1149 火柴棒等式

题目描述

给你n根火柴棍,你可以拼出多少个形如“A+B=C ”的等式?等式中的是用火柴棍拼出的整数(若该数非零,则最高位不能是)。用火柴棍拼数字0-9 的拼法如图所示:

注意:

  1. 加号与等号各自需要两根火柴棍

  2. 如果A≠B  A+B=C B+A=C 视为不同的等式(A,B,C>=0 )

  3. n根火柴棍必须全部用上

输入格式

一个整数n(n<=24)

输出格式

一个整数,能拼成的不同等式的数目。

输入输出样例

输入 
14
输出
2
输入 
18
输出 
9

说明/提示

【输入输出样例1解释】

2个等式为0+1=11+0=1

【输入输出样例2解释】

9个等式为:

0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
 1 n最大为24,减去4根用于等号和加号,剩下的20根,
 2 分给因子 和   和,所以因子最多用8根,就是1111 
 3 1111+1=1112-->最大用了25个超过24个
 4 
 5 解法:
 6 
 7 #include<bits/stdc++.h>
 8 using namespace std;
 9 map<int,int> mp;
10 int cnt(int x)     //一个用来计算一个数需多少个火柴棒的函数
11 {
12     if(mp[x]) return mp[x];//已经计算过了,可以返回了
13     if(x==0) return mp[0]; //将这个数字每一位的火柴棒的数量都计算出来
14     int tmp=x,sum=0;
15     while(tmp!=0){
16         sum+=mp[tmp%10];
17         tmp/=10;
18     }
19     return sum;
20 }
21 int main()
22 {
23     int i,j,Sum=0,n;    //sum是符合条件的
24     cin>>n;
25     for(int i=0;i<=2222;i++){//存到 数据里面
26         if(i==0||i==6||i==9) mp[i]=6;
27         else if(i==1) mp[i]=2;
28         else if(i==2||i==3||i==5)mp[i]=5;
29         else if(i==4) mp[i]=4;
30         else if(i==7) mp[i]=3;
31         else if(i==8) mp[i]=7;
32         else mp[i]=cnt(i);
33         cout<<i<<" "<<mp[i]<<" "<<endl;
34     }
35     for(i=0; i<=1000; i++)//暴力查找
36         for(j=0; j<=1000; j++)
37            if(mp[i]+mp[j]+mp[i+j]+4==n)
38                 Sum++;
39     cout<<Sum<<endl;
40     return 0;
41 }


原文地址:https://www.cnblogs.com/NirobertEinteson/p/12040668.html