문제
접근 방식
입력 받은 추의 무게로 만들 수 있는 모든 무게를 찾기 위해 DP를 활용한다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main_2629 {
static int Ngrams[], Mgrams[];
static int[] numbers;
static int N, M;
static boolean isCheck;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine()); // 추 개수
Ngrams = new int[N]; // 추 무게 배열
// 추 입력
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
Ngrams[i] = Integer.parseInt(st.nextToken());
}
M = Integer.parseInt(br.readLine()); // 구슬 개수
Mgrams = new int[M]; // 구슬 무게 배열
// 구슬 입력
st = new StringTokenizer(br.readLine());
for(int i=0;i<M;i++) {
Mgrams[i] = Integer.parseInt(st.nextToken());
}
boolean isValid[] = new boolean[15001];
for(int i=0;i<N;i++) {
List<Integer> list = new ArrayList<>();
list.add(Ngrams[i]);
for(int j=0;j<=15000;j++) {
if(isValid[j]) {
if(j+Ngrams[i] <= 15000) list.add(j+Ngrams[i]);
list.add(Math.abs(j-Ngrams[i]));
}
}
for(int j=0;j<list.size();j++) {
isValid[list.get(j)] = true;
}
}
StringBuilder sb = new StringBuilder();
for(int i=0;i<M;i++) {
if(Mgrams[i] > 15000) sb.append("N ");
else if(isValid[Mgrams[i]]) sb.append("Y ");
else sb.append("N ");
}
System.out.println(sb);
}
}