BOJ 1450. ๋ ์๋ฌธ์
๐โโ๏ธ[Gold I] ๋ ์๋ฌธ์ - 1450
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2920 KB, ์๊ฐ: 8 ms
๋ถ๋ฅ
์ด๋ถ ํ์, ์ค๊ฐ์์ ๋ง๋๊ธฐ
์ ์ถ ์ผ์
2024๋ 6์ 10์ผ 20:15:43
๋ฌธ์ ์ค๋ช
์ธ์ค์ด๋ N๊ฐ์ ๋ฌผ๊ฑด์ ๊ฐ์ง๊ณ ์๊ณ , ์ต๋ C๋งํผ์ ๋ฌด๊ฒ๋ฅผ ๋ฃ์ ์ ์๋ ๊ฐ๋ฐฉ์ ํ๋ ๊ฐ์ง๊ณ ์๋ค.
N๊ฐ์ ๋ฌผ๊ฑด์ ๊ฐ๋ฐฉ์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. N์ 30๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์, C๋ 109๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ด ์๋ ์ ์์ด๋ค. ๋์งธ ์ค์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ ์ฃผ์ด์ง๋ค. ๋ฌด๊ฒ๋ 109๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฐ๋ฐฉ์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ํ์ด
์ด ๋ฌธ์ ๋ ๋ถ๋ถ ์งํฉ์ ํ์ฉํ ์กฐํฉ์ ๋ฌธ์ ๋ก, ์ฃผ์ด์ง ๋ฌผ๊ฑด๋ค์ ๋ฌด๊ฒ๋ฅผ ์กฐํฉํ์ฌ ์ต๋ ๋ฌด๊ฒ C๋ฅผ ์ด๊ณผํ์ง ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ ๋ฌธ์ ์
๋๋ค.
๋ฌผ๊ฑด์ ๊ฐ์๊ฐ 30๊ฐ ์ดํ์ด๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ โMeet in the Middleโ ๊ธฐ๋ฒ์
๋๋ค.
- ํด๊ฒฐ ์ ๋ต
- ์ฃผ์ด์ง ๋ฌผ๊ฑด์ ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋๋๋ค.
- ๊ฐ๊ฐ์ ๊ทธ๋ฃน์์ ๊ฐ๋ฅํ ๋ชจ๋ ๋ถ๋ถ ์งํฉ์ ํฉ์ ๊ณ์ฐํฉ๋๋ค.
- ๋ ๊ทธ๋ฃน์ ํฉ์ ์กฐํฉํ์ฌ ์ต๋ ๋ฌด๊ฒ C๋ฅผ ์ด๊ณผํ์ง ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ๊ตฌํ ๋จ๊ณ
- ๋ฌผ๊ฑด์ ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋ ํ, ๊ฐ ๊ทธ๋ฃน์์ ๊ฐ๋ฅํ ๋ชจ๋ ๋ถ๋ถ ์งํฉ์ ํฉ์ ๊ตฌํฉ๋๋ค.
- ํ ๊ทธ๋ฃน์ ํฉ์ ๊ณ ์ ํ๊ณ , ๋ค๋ฅธ ๊ทธ๋ฃน์ ํฉ์์ ์ ์ ํ ๊ฐ์ ์ด์ง ํ์์ผ๋ก ์ฐพ์ ์กฐํฉํ์ฌ ์ต๋ ๋ฌด๊ฒ C๋ฅผ ์ด๊ณผํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ ๋ ฅ ์ฒ๋ฆฌ: N๊ณผ C, ๊ทธ๋ฆฌ๊ณ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค.
- ๋ถ๋ถ ์งํฉ ํฉ ๊ณ์ฐ: calculateSubsets ํจ์๋ฅผ ์ด์ฉํด ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋ ๊ฐ๊ฐ์ ๋ฌผ๊ฑด์์ ๊ฐ๋ฅํ ๋ชจ๋ ๋ถ๋ถ ์งํฉ์ ํฉ์ ๊ณ์ฐํฉ๋๋ค.
- ์ด์ง ํ์์ ํตํ ์กฐํฉ ๊ณ์ฐ: ์ฒซ ๋ฒ์งธ ๊ทธ๋ฃน์ ํฉ์ ๊ณ ์ ํ๊ณ , ๋ ๋ฒ์งธ ๊ทธ๋ฃน์ ํฉ์์ C๋ฅผ ๋์ง ์๋ ๊ฐ์ ์ด์ง ํ์์ ํตํด ์ฐพ์์ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ๊ณ์ฐํฉ๋๋ค.
- ๊ฒฐ๊ณผ ์ถ๋ ฅ: ๊ณ์ฐ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๋ชฐ๋ผ์ ์ฐพ์๋ณธ๊ฑด๋ฐ ๋ด๋ ๋ชจ๋ฅด๊ฒ ๋ค.
Meet in the Middle์ ๋ํด์ ๋ ์ฐพ์๋ดค๋ค.
Meet in the Middle ๊ธฐ๋ฒ ์ค๋ช
๊ฐ๋
- ๋ฌธ์ ๋ถํ : ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ๋ ๊ฐ์ ํ์ ๋ฌธ์ ๋ก ๋ถํ ํฉ๋๋ค.
- ๋ถ๋ถ ์งํฉ ๊ณ์ฐ: ๊ฐ ํ์ ๋ฌธ์ ์์ ๊ฐ๋ฅํ ๋ชจ๋ ๋ถ๋ถ ์งํฉ์ ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
- ์กฐํฉ: ๋ ํ์ ๋ฌธ์ ์์ ์ป์ ๋ถ๋ถ ์งํฉ์ ์ ์ ํ ์กฐํฉํ์ฌ ์ต์ข ๋ฌธ์ ์ ํด๋ฅผ ๊ตฌํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์ ์ ํฌ๊ธฐ๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ด๊ณ , ๊ฐ ์ ๋ฐ์ ๋ํด ๋ชจ๋ ๋ถ๋ถ ์งํฉ์ ๊ณ์ฐํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ ๋ฌธ์ ๊ฐ ์ง๋ ํ์ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
๋ผ๊ณ ํ๋ค. ์ ๋ชฐ๋ผ
๐์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <climits>
using namespace std;
// ์ฃผ์ด์ง ๋ฒกํฐ์์ ๊ฐ๋ฅํ ๋ถ๋ถ ์งํฉ์ ํฉ์ ๋ชจ๋ ๊ตฌํ๋ ํจ์
void calculateSubsets(const vector<long long>& weights, vector<long long>& subsets)
{
int n = weights.size();
for (int i = 0; i < (1 << n); ++i)
{
long long sum = 0;
for (int j = 0; j < n; ++j)
{
if (i & (1 << j))
{
sum += weights[j];
}
}
subsets.push_back(sum);
}
}
void solve()
{
int N;
long long C;
cin >> N >> C;
vector<long long> weights(N);
for (int i = 0; i < N; ++i)
{
cin >> weights[i];
}
// ๋ฌผ๊ฑด์ ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋๊ธฐ
int mid = N / 2;
vector<long long> group1(weights.begin(), weights.begin() + mid);
vector<long long> group2(weights.begin() + mid, weights.end());
vector<long long> subsets1, subsets2;
// ๊ฐ ๊ทธ๋ฃน์์ ๊ฐ๋ฅํ ๋ถ๋ถ ์งํฉ์ ํฉ ๊ณ์ฐ
calculateSubsets(group1, subsets1);
calculateSubsets(group2, subsets2);
// ๋ ๋ฒ์งธ ๊ทธ๋ฃน์ ๋ถ๋ถ ์งํฉ ํฉ์ ์ ๋ ฌ
sort(subsets2.begin(), subsets2.end());
long long count = 0;
// ์ฒซ ๋ฒ์งธ ๊ทธ๋ฃน์ ๋ถ๋ถ ์งํฉ ํฉ์ ์ํํ๋ฉฐ ๊ฐ๋ฅํ ์กฐํฉ์ ์ฐพ๊ธฐ
for (const auto& sum1 : subsets1)
{
if (sum1 <= C)
{
// subsets2์์ sum1๊ณผ ํฉ์ณ์ C๋ฅผ ๋์ง ์๋ ์์์ ๊ฐ์๋ฅผ ์ฐพ๊ธฐ
count += upper_bound(subsets2.begin(), subsets2.end(), C - sum1) - subsets2.begin();
}
}
cout << count << '\n';
}
int main()
{
FILE* stream;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen_s(&stream, "input.txt", "rt", stdin);
solve();
return 0;
}