Description
写一个程序,给出D(2≤D≤10)个数字,按原顺序在数字间加+,一,×算出24,且不使用括
号.优先级按正常的优先级处理,即先做乘法后做加减法.输出有多少种不同的方案数.
Input
第1行:一个整数D.
第2到D+1行:D个整数,在1到50之间.
Output
输出方案总数.
Sample Input
5
6
4
2
8
16
6
4
2
8
16
Sample Output
4
样例说明
四种方法分别是6x4x2-8-16,6-4- 2+8+16,6x4-2 x8+16,6×4+2×8-16.
样例说明
四种方法分别是6x4x2-8-16,6-4- 2+8+16,6x4-2 x8+16,6×4+2×8-16.
HINT
总共才9个符号啊= =
O(3^D)爆搜就好了。。
中间可能要用到+,-,*表达式求值,那就先把-后面的数取负了,然后再*,最后+。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,ans,g[11],a[11];
ll b[11];
ll calc(){
for (int i=1;i<=n;i++) b[i]=a[i];
for (int i=1;i<n;i++)
if (g[i]==2) b[i+1]=-b[i+1];
for (int i=1;i<n;i++)
if (g[i]==0) b[i+1]=b[i+1]*b[i],b[i]=0LL;
ll s=0LL;
for (int i=1;i<=n;i++) s+=b[i];
return s;
}
void dfs(int now){
if (now==n){
if (calc()==24) ans++;
return;
}
g[now]=0,dfs(now+1);
g[now]=1,dfs(now+1);
g[now]=2,dfs(now+1);
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(1);
printf("%d\n",ans);
return 0;
}