Sol1) DP
추를 쓸지 안쓸지로 생각하면 2^30이기 때문에 백트래킹으로는 안 풀린다는 것이 느껴집니다. N이 애매한 수치인데 배낭문제 아닐까 생각하게 됩니다.
추가 1g, 4g이 있다고 가정해봅시다.
1g만 있을 때는 1만 체크할 수 있습니다.
4g이 추가적으로 들어온다면 4-1, 4+1, 4, 1을 체크할 수 있습니다.
1. DP[i][j] = DP[i - 1][j + arr[i])) // j = 1, arr[i] = 4
2. DP[i][j] = DP[i - 1][abs(j - arr[i])] // j = 1, arr[i] = 4 -> 4 - 1
3. DP[i][j] = DP[i - 1][j] // i - 1번째에서 성공한 모든 경우는 i번째 추를 안쓰면 되기 때문에 다 됩니다.
4. DP[i][arr[i]] = true
소스 코드
#include <bits/stdc++.h>
#define FASTIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
const int MAXN = 35;
bool DP[MAXN][40005]; // 개수, 무게
int arr[MAXN];
int main(){
FASTIO;
int n, m;
cin >> n;
for (int i = 0; i < n; i++) cin >> arr[i];
DP[0][arr[0]] = true;
for (int i = 1; i < n; i++){
DP[i][arr[i]] = true;
for (int j = 1; j <= 40000; j++){
if (DP[i - 1][j]) DP[i][j] = true;
else if (DP[i - 1][abs(j - arr[i])]) DP[i][j] = true;
else if (DP[i - 1][j + arr[i]]) DP[i][j] = true;
}
}
cin >> m;
for (int i = 0; i < m; i++){
int num; cin >> num;
if (DP[n - 1][num]) cout << "Y ";
else cout << "N ";
}
return 0;
}
'Algorithm > Contest' 카테고리의 다른 글
[BOJ] 1253번 좋다 (0) | 2024.07.20 |
---|---|
엘리스 코드 챌린지 예선 후기 (0) | 2024.07.19 |
2024 SCPC 예선 1차 합격 후기 (3) | 2024.07.14 |