https://www.acmicpc.net/problem/14888
N<11이므로 완전탐색이 가능하다고 생각했고, 재귀함수에서 현재까지 계산한 값을 받아서 4개의 연산자를 한번씩 덧붙여서 재귀하면 된다.
참고로 결과물(중간결과물 포함)이 다 10만(10^9)이하래서 int로 해결가능하다.
https://www.acmicpc.net/source/23167877
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
vector<int> nums;
int mmin=pow(10,9), mmax=-pow(10,9);//전체 결과중에서
int counter = 0;
void one_proc(int mom_res, int s, vector<int> yeons,vector<int> tracker) {//s는 연산자가 적용될 인덱스
counter++;
if (s == nums.size()) {
/*
cout << "계산결과 비교중" << mmin << " , " << mmax << " , " << mom_res << endl;
for (int i = 0; i < tracker.size(); i++) {
cout << tracker[i] << " ";
}
cout << endl;
*/
mmin = min(mmin, mom_res);
mmax = max(mmax, mom_res);
return;
}
for (int i = 0; i < 4; i++) {
int res = mom_res;
if (yeons[i] <= 0) {
continue;
}
yeons[i]--;
if (i == 0) {
res = res + nums[s];
}
else if (i == 1) {
res = res - nums[s];
}
else if (i == 2) {
res = res * nums[s];
}
else if (i == 3) {
if (res > 0) {
res = res / nums[s];
}
else {
res = -(abs(res) / nums[s]);
}
}
vector<int> temp_tracker = tracker;
temp_tracker.push_back(i);
/*
cout << "right before dfs" << endl;
for (int i = 0; i < temp_tracker.size(); i++) {
cout << temp_tracker[i] << " ";
}
cout << " == " << res << endl;
*/
one_proc(res, s + 1, yeons,temp_tracker);
yeons[i]++;//복구
}
}
int main() {
int n;
vector<int> yeons;//4가지 연산자의 개수
cin >> n;
int num;
for (int i = 0; i < n; i++) {
cin >> num;
nums.push_back(num);
}
for (int i = 0; i < 4; i++) {
cin >> num;
yeons.push_back(num);
}
vector<int> tracker;
one_proc(nums[0], 1, yeons,tracker);
cout << mmax << endl;
cout << mmin << endl;
}