题目描述
给你 n 根火柴棍,你可以拼出多少个形如A+B=C 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。用火柴棍拼数字 0∼9 的拼法如图所示:
注意:
- 加号与等号各自需要两根火柴棍;
- 则 A+B=C 与 B+A=C 视为不同的等式A,B,C≥0);
- n 根火柴棍必须全部用上。
输入格式
一个整数(1≤n≤24)。
输出格式
一个整数,能拼成的不同等式的数目。
输入输出样例
输入 #1复制
14
输出 #1复制
2
输入 #2复制
18
输出 #2复制
9
说明/提示
【输入输出样例 1 解释】
2 个等式为 0+1=1和 1+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。
noip2008 提高第二题
题目解析
//思路 就是三个位置枚举
满足:1.a+b=c
2.a b c 火柴之和等于n-4(去掉+=)
拿到这个题可能会想到的问题
//问题 10往上的数字所需火柴棒怎么存呢---->预处理递推
//开多大的数组,怎么分析 先保守估计10000
//超时怎么处理---->剪枝
package dfs;
import java.util.Scanner;
public class 火柴棒 {
//问题 11往上的数字怎么存呢 写一个函数
//预处理递推
//开多大的数组,怎么分析
//思路 三个位置枚举
//满足:1.a+b=c 2.a b c 火柴之和等于n-4
//超时怎么处理
static int a[]=new int [10000];//存答案
static int n;
static int ans=0;
static int huo[]=new int [10000];//记录火柴棒个数
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
huo[0]=6;huo[1]=2;huo[2]=5;huo[3]=5;huo[4]=4;huo[5]=5;huo[6]=6;huo[7]=3;
huo[8]=7;huo[9]=6;
for(int i=10;i<10000;i++)
{//获得对应数字的火柴个数
//写两个循环 时间复杂度太大了 达不到递推的效果
huo[i]+=huo[i%10]+huo[i/10];
}
dfs(1,0);
System.out.println(ans);
}
//cur 正在处理第几个数字
//sum现在用了多少火柴了
static void dfs(int cur,int sum)
{
if(sum>n ) return;//这个剪枝很重要
if(cur>3)
{
if(a[1]+a[2]==a[3]&&sum==n-4)
ans++;
return;
}
for(int i=0;i<=10000;i++)
{
a[cur]=i;
dfs(cur+1,sum+huo[i]);
a[cur]=0;//回溯}
}
}
}