백준 17610번: 양팔저울

최창효·2022년 8월 25일
0
post-thumbnail

문제 설명

접근법

  • 추를 활용하는 방법은 추를 물건 반대편에 놓는다, 추를 물건과 함께 놓는다, 추를 안놓는다 3 가지 경우의 수만 존재합니다.
  • k가 13으로 작아 완전탐색이 가능하다 생각했습니다.(3^13<1_000_000)
  • 부분집합으로 문제를 풀었습니다.

정답


import java.util.*;
import java.io.*;

public class Main {
	static boolean[] v;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] num = new int[N];
		int maxVal = 0;
		for (int i = 0; i < N; i++) {
			num[i] = sc.nextInt();
			maxVal += num[i];
		}
		v = new boolean[maxVal + 1];

		subset(0, N, num, new int[N]);
		int score = 0;
		for (int i = 1; i <= maxVal; i++) {
			if (!v[i])
				score++;
		}
		System.out.println(score);
	}

	public static void subset(int depth, int N, int[] num, int[] answer) {
		if (depth == N) {
			int sum = 0;
			for (int i = 0; i < N; i++) {
				sum += answer[i];
			}
			if (sum <= 0) return; // 합이 음수인 경우는 제외
			v[sum] = true;
			return;
		}

		answer[depth] = num[depth];
		subset(depth + 1, N, num, answer);

		answer[depth] = -num[depth];
		subset(depth + 1, N, num, answer);

		answer[depth] = 0;
		subset(depth + 1, N, num, answer);

	}
}
profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글