๋ถ๋ถ์์ด์ ํฉ(๋ฌธ์ _ 1182)
N๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์์ ๋, ํฌ๊ธฐ๊ฐ ์์์ธ ๋ถ๋ถ์์ด ์ค์์ ๊ทธ ์์ด์ ์์๋ฅผ ๋ค ๋ํ ๊ฐ์ด S๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์
๋ ฅ
์ฒซ์งธ ์ค์ ์ ์์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ N๊ณผ ์ ์ S๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) ๋์งธ ์ค์ N๊ฐ์ ์ ์๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง๋ ์ ์์ ์ ๋๊ฐ์ 100,000์ ๋์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํฉ์ด S๊ฐ ๋๋ ๋ถ๋ถ์์ด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์
5 0
-7 -3 -2 5 8
answer : 1
ํ์ด
์ค๋ช ์ฐธ๊ณ - https://blog.encrypted.gg/732?category=773649
์๋ฅผ ๋ค์ด n์ด 3์ผ๋ 0๋ถํฐ 2^n^-1์ ์ซ์๋ฅผ ์ด์ฉํด ๋ถ๋ถ ์์ด์ ๋ํ๋ผ ์ ์๋ค.
์ซ์ | a[2] | a[1] | a[0] |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 |
3 | 0 | 1 | 1 |
4 | 1 | 0 | 0 |
5 | 1 | 0 | 1 |
6 | 1 | 1 | 0 |
8 | 1 | 1 | 1 |
a[3] = { 1,2,3 } ์ด๋ผ๊ณ ํ ๋,
[์ซ์ 1] arr[0] = {1} ์ ํ
[์ซ์ 2] arr[1] = {2} ์ ํ
[์ซ์ 3] arr[0],arr[1] = {1,2} ์ ํ
[์ซ์ 4] arr[2] = {3} ์ ํ
์ด๋ฐ์์ผ๋ก ๊ธธ์ด๊ฐ n์ธ ์์ด์ ๋ถ๋ถ ์์ด์ ๋ชจ๋ ๋ํ๋ผ ์ ์๋ค.
a[0]์ด ๋ถ๋ถ ์์ด์ ํฌํจ๋๋์ง์ ์ฌ๋ถ๋ 2^0์ ์๋ฆฌ๊ฐ 1์ด๋ผ๋ฉด ํฌํจ
a[1]์ด ๋ถ๋ถ ์์ด์ ํฌํจ๋๋์ง์ ์ฌ๋ถ๋ 2^1์ ์๋ฆฌ๊ฐ 1์ด๋ผ๋ฉด ํฌํจ
a[2]์ด ๋ถ๋ถ ์์ด์ ํฌํจ๋๋์ง์ ์ฌ๋ถ๋ 2^2์ ์๋ฆฌ๊ฐ 1์ด๋ผ๋ฉด ํฌํจ
2^0, 2^1, 2^2์ ์๋ฆฌ๊ฐ 1์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ 10์ง์์์ 2์ง์๋ก ๋ณ๊ฒฝํ ๋์ฒ๋ผ 2๋ก ๋๋๊ณ ๋๋จธ์ง ๊ฐ์ ํ์ธํ๋ฉด ๋๋ค.
์ฝ๋
int arr[21];
int cnt; // ๋ง์กฑํ๋ ๋ถ๋ถ์์ด์ ๊ฐ์
int main() {
int n, s;
cin >> n >> s;
for (int i = 0; i < n; i++) cin >> arr[i];
for (int i = 1; i < (1 << n); i++) { // 2^n์น๊น์ง
int sum = 0;
int tmp = i; // 2๋ก ๋๋ ์
for (int j = 0; j < n; j++) {
if (tmp % 2 == 1) { // arr[j] ์ ํ -> ๋ถ๋ถ ์์ด์ ๋ค์ด๊ฐ
sum += arr[j];
}
tmp /= 2; // 2๋ก ๋๋๋ค. ๋ค์์ ์ ํํ ๊ฑฐ
}
if (sum == s) cnt++;
}
cout << cnt;
}