最小的数_DFS
题意:
给我们4个数,3个运算符,每次取出两个数、一个运算符计算出新的数,直到只剩下1个数,求最小的这个数。
这道题数据很小,可以直接DFS。
1.每次选出for套for选两个数,将运算出来的结果放在序列后面,最后答案必定在A[7]。
2.记得结果变量的只要开大一点,要开到1e12。(每个数最大到1000,四个数相乘会到1e12)
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
ll a[10],ans = 1e12 + 10;
char c[10];
bool b[10];
inline ll min1(ll x,ll y)
{
return x < y ? x : y;
}
inline void dfs(ll);
int main()
{
ios::sync_with_stdio(false);
for(int i = 1;i <= 4;++i) cin >> a[i];
for(int i = 1;i <= 3;++i) cin >> c[i];
dfs(1);
cout << ans << endl;
return 0;
}
inline void dfs(ll p)
{
if(p == 4)
{
ans = min1(ans,a[7]);
return ;
}
for(int i = 1;i <= p + 3;++i)
{
if(!b[i])
{
for(int j = 1;j <= p + 3;++j)
{
if(!b[j]&&i != j)
{
if(c[p] == '+')
{
b[i] = b[j] = true;
a[p + 4] += a[i] + a[j];
dfs(p + 1);
a[p + 4] = 0;
b[i] = b[j] = false;
}
else
{
b[i] = b[j] = true;
a[p + 4] += a[i] * a[j];
dfs(p + 1);
a[p + 4] = 0;
b[i] = b[j] = false;
}
}
}
}
}
}