문제 링크
http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=627&sca=99&sfl=wr_hit&stx=1352
https://www.acmicpc.net/problem/2629
풀이
dp에 현재 가지고 있는 추로 잴수있는 모든 경우를 표시해 놓는다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static boolean[][] dp;
static int[] w;
static int n;
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
n=Integer.parseInt(br.readLine());
w=new int[n+1];
dp=new boolean[31][15000];
StringTokenizer st=new StringTokenizer(br.readLine());
for(int i=0;i<n;i++) {
w[i]=Integer.parseInt(st.nextToken());
}
solv(0,0);
int m=Integer.parseInt(br.readLine());
st=new StringTokenizer(br.readLine());
StringBuilder sb=new StringBuilder();
for(int i=1;i<=m;i++) {
int temp=Integer.parseInt(st.nextToken());
if(temp>15000)sb.append("N ");//500g * 30개
else if(dp[n][temp])sb.append("Y ");
else sb.append("N ");
}
//----------------입력
bw.append(sb.toString());
bw.flush();
bw.close();
}
private static void solv(int idx, int now) {
if(idx>n||dp[idx][now])return;
dp[idx][now]=true;//방문
solv(idx+1, now+w[idx]);//추를 올린 경우
solv(idx+1, now);//추를 올리지 않은 경우
solv(idx+1,Math.abs(now-w[idx]));//추를 구슬과 같이 올린경우
}
}
반응형
'Algorithm > 정올' 카테고리의 다른 글
기업투자(정올 1825,백준2662) (0) | 2021.07.01 |
---|---|
전기줄 (정올 1257, 백준 2568) (0) | 2021.07.01 |
영역구하기 (정올 1457, 백준 2583) (0) | 2021.06.27 |
세 줄로 타일 깔기 (정올 2112) (0) | 2021.06.27 |
해밀턴순회회로2 (정올 1545 ) (0) | 2021.06.26 |
댓글