μ€κ°μμ λ§λκΈ°(Meet In The Middle)
μκ³ λ¦¬μ¦ λ¬Έμ λ₯Ό ν λ μμ νμμΌλ‘ νμνλ κ²½μ°, νμμ λ²μκ° μ»€μ§μλ‘ κ²½μ°μ μμ μ°μ°λμ΄ κΈ°νκΈμμ μΌλ‘ λμ΄λλ κ²μ λ³Ό μκ° μλ€. μ΄λ μ€κ°μμ λ§λκΈ° λ°©μμ μ¬μ©νλ©΄, μκ° λ³΅μ‘λλ₯Ό μ κ³±κ·Όλ§νΌ μ€μΌ μ μλ€.
μ€κ°μμ λ§λκΈ° λ°©μμ μμͺ½κ³Ό λ€μͺ½μμ μ λ°μ© μ κ·Όνμ¬ μ€κ°μμ νμν κ²°κ³Όκ° λ§λκ² νλ νμ κΈ°μ μ μλ―Ένλ€. μ¦, μ€κ°μμ λ§λ μ°μ°μ κ²°κ³Όλ₯Ό ν©μ³ μ 체 κ²°κ³Όλ₯Ό λ½μλ΄λ κ²μ΄λ€.
λ¬Έμ
https://www.acmicpc.net/problem/1208
#include<iostream>
#include<map>
using namespace std;
int N, S;
int arr[41];
long long answer;
map<int, int> subsum;
void MeetInTheMiddle(int start, int end, int sum)
{
if (start == end) {
if (end == N)
answer += subsum[S - sum]; // 2. μ€λ₯Έμͺ½ ν©(=S-μΌμͺ½ ν©) κ°μ ꡬνκΈ°
else
subsum[sum]++; // 1. μΌμͺ½ ν© κ°μ ꡬνκΈ°
return;
}
MeetInTheMiddle(start + 1, end, sum + arr[start]);
MeetInTheMiddle(start + 1, end, sum);
}
int main()
{
ios_base::sync_with_stdio(NULL);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> S;
for (int i = 0; i < N; i++)
cin >> arr[i];
MeetInTheMiddle(0, N / 2, 0);
MeetInTheMiddle(N / 2, N, 0);
// μ무κ²λ λ½μ§ μμμ λ λΉΌμ£ΌκΈ°
answer += S == 0 ? -1 : 0;
cout << answer;
}