题目的意思就是给你几个数字,问能不能通过加减乘除的得到目标值(运算符不分等级)
回溯 + 判重;
判重需要注意一点,我们记录的的有个东西,数字的数量和结果,即如果算了5个数字了,结果是10.那么vis[ 5 ] [10]标记。
还有就是结果如果大于32000,就不用算了,直接return.(题目要求)
AC代码:
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
const int N = 100 + 5;
const int M = 64000 + 5;
int vis[N][M];
int num[N];
char flag[N];
int t;
int target;
bool ok;
void dfs(int cur, int sum) {
if (sum > 32000 || sum < -32000)
return ;
if (vis[cur][sum] == 1)
return;
vis[cur][sum] = 1;
if (ok == true)
return ;
if (cur == t && sum == target) {
ok = true;
return ;
}
if (cur == t)
return;
flag[cur] = '+';
dfs(cur + 1 , sum + num[cur]);
if (ok)
return;
flag[cur] = '*';
dfs(cur + 1 , sum * num[cur]);
if (ok)
return;
flag[cur] = '-';
dfs(cur + 1 , sum - num[cur]);
if (ok)
return;
if(num[cur] != 0 && sum % num[cur] == 0) {
flag[cur] = '/';
dfs(cur + 1 , sum / num[cur]);
}
}
int main () {
int c;
cin >> c;
while (c--) {
ok = false;
memset(vis , 0 ,sizeof(vis));
cin >> t;
for (int i = 0 ; i < t ;i++) {
cin >> num[i];
}
cin >> target;
dfs(1,num[0]);
if (ok) {
for (int i = 0 ;i < t ;i++) {
if (i != t - 1)
cout << num[i] << flag[i + 1];
else
cout << num[i] << "=" << target <<endl;
}
}
else {
cout << "NO EXPRESSION" <<endl;
}
}
}