πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #1182 λΆ€λΆ„μˆ˜μ—΄μ˜ ν•©

dar0m! 2019. 9. 4. 02:13
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
2 초 256 MB 44.845 %

 

 

1182번: λΆ€λΆ„μˆ˜μ—΄μ˜ ν•©

첫째 쀄에 μ •μˆ˜μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Nκ³Ό μ •μˆ˜ Sκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) λ‘˜μ§Έ 쀄에 N개의 μ •μˆ˜κ°€ 빈 칸을 사이에 두고 μ£Όμ–΄μ§„λ‹€. μ£Όμ–΄μ§€λŠ” μ •μˆ˜μ˜ μ ˆλŒ“κ°’μ€ 100,000을 λ„˜μ§€ μ•ŠλŠ”λ‹€.

www.acmicpc.net

N개의 μ •μˆ˜λ‘œ 이루어진 μˆ˜μ—΄μ΄ μžˆμ„ λ•Œ, 크기가 μ–‘μˆ˜μΈ λΆ€λΆ„μˆ˜μ—΄ μ€‘μ—μ„œ κ·Έ μˆ˜μ—΄μ˜ μ›μ†Œλ₯Ό λ‹€ λ”ν•œ 값이 Sκ°€ λ˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

λ©”λͺ¨λ¦¬ μ‹œκ°„
1988 KB 4 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
 
int n, s, ans;
int arr[30];
void func(int idx, int sum) {
    if (n == idx) {
        if (s == sum) {
            ans++;
        }
        return;
    }
    func(idx + 1, sum + arr[idx]);
    func(idx + 1, sum);
}
int main() {
    scanf("%d%d",   n,   s);
    for (int i = 0; i < n; i++) {
        scanf("%d", arr[i]);
    }
    func(00);
    if (s == 0) ans--;
    printf("%d", ans);
 
    return 0;
}
cs

 

 

λΉ„μŠ·ν•˜μ§€λ§Œ 더 효율적인 방법

λ©”λͺ¨λ¦¬ μ‹œκ°„
1116 KB 0 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int n,s,cnt,a[30];
 
void find(int i,int sum){
    if(sum+a[i]==s) cnt++;
    if(i==n-1return;
    find(i+1,sum); find(i+1,sum+a[i]);
}
 
int main(){
    scanf("%d %d",&n,&s);
    for(int i=0; i<n; i++){
        scanf("%d",&a[i]);
    }
    find(0,0);
    printf("%d",cnt);
}
cs