알고리즘 문제/[백준]

[백준] 16287 Parcel

latter2005 2021. 1. 21. 00:56

문제 주소 : www.acmicpc.net/problem/16287

 

16287번: Parcel

입력은 표준입력을 사용한다. 입력의 첫 줄에는 무게 w(10 ≤ w ≤ 799,994)와 A의 원소 개수 n(4 ≤ n ≤ 5,000)이 공백으로 분리되어 주어진다. 다음 줄에는 A의 원소인 n개의 정수 ai ∈ A(1 ≤ i ≤ n)가

www.acmicpc.net

문제 확인

 

dp 문제입니다.

dp를 사용하지 않고 4중 포문으로 풀면 n이 5000이기 때문에 시간 초과가 납니다. 따라서 문제를 i + j, w - (i + j) 두 파트로 나누어 문제를 풀어야 합니다.

 

풀이

 

무게를 인덱스로 활용해 만들 수 있는 무게를 기록합니다. 각 원소의 최대 크기는 200000으로 dp[400000]을 사용합니다.

2중 포문으로 지나처온 리스트에서 만들 수 있는 w 값을 배열에 기록해두고 다음 i, j를 사용해 만든 w - (i + j) 값이 기록되어 있다면 Yes를 출력합니다.

입력받은 값을 정렬해 ary[i+1] + ary[j] 값이 필요 이상으로 커지게 되면 break를 통해 탐색 횟수를 줄입니다.

 

코드

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
#include <cstdio>
#include <algorithm>
using namespace std;
int main() {
    int w, n, ary[5000];
    bool dp[400001= { 0 };
    scanf("%d%d"&w, &n);
 
    for (int i = 0; i < n; i++)
        scanf("%d"&ary[i]);
    sort(ary, ary + n);
    for (int i = 0; i < n - 2; i++) {
        for (int j = 0; j < i; j++)
            dp[ary[i] + ary[j]] = true;
 
        for (int j = i + 2; j < n; j++) {
            int t = w - ary[i + 1- ary[j];
            if (t < 0)break;
            if (t <= 400000 && dp[t]) {
                printf("YES");
                return 0;
            }
        }
 
    }
    printf("NO");
}
cs
반응형

'알고리즘 문제 > [백준]' 카테고리의 다른 글

[백준] 2252 줄 세우기  (0) 2021.01.24
[백준] 6549 히스토그램에서 가장 큰 직사각형  (1) 2021.01.22
[백준] 1256 사전  (0) 2021.01.20
[백준] 7579 앱  (0) 2021.01.18
[백준] 1019 책 페이지  (0) 2021.01.18