문제 주소 : 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 |