-
[BOJ] 근손실Algorithm/BOJ 2021. 1. 20. 22:50
[18429] 근손실
www.acmicpc.net/problem/status/18429/3/1
Solution
- 가장 기본적인 백트래킹 유형이라고 할 수 있다.
- N은 물론 8이하이고, 모든 순열에 대해 문제의 조건을 충족하는 경우(근손실 없이 N개의 운동 장비를 사용할 수 있는지)만 카운트한다.
소스코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.*;public class Main {static int n, k, answer;static int[] order;static Kit[] info;static class Kit {private int weight;private boolean used;public Kit(int weight, boolean used) {this.weight = weight;this.used = used;}}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StringTokenizer st = new StringTokenizer(br.readLine());n = stoi(st.nextToken());k = stoi(st.nextToken());order = new int[n];info = new Kit[n];st = new StringTokenizer(br.readLine());for (int i = 0; i < n; i++) {info[i] = new Kit(stoi(st.nextToken()), false);}
// 시작 번호는 고정 (0 ~ N-1)answer = 0;for (int i = 0; i < n; i++) {int sum = 500 + info[i].weight - k;if(sum >= 500){info[i].used = true;dfs(i, 1, sum);info[i].used = false;}}System.out.println(answer);}private static void dfs(int num, int count, int sum) {// N개의 운동 장비를 모두 사용했을 때 카운트
if (count == n) {answer++;return;}for (int i = 0; i < n; i++) {if (!info[i].used && (sum + info[i].weight - k) >= 500) {info[i].used = true;dfs(i, count + 1, sum + info[i].weight - k);info[i].used = false;}}}private static int stoi(String s) {return Integer.parseInt(s);}}cs 'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 빵집(JAVA) (0) 2021.01.25 [BOJ] 월드컵(JAVA) (0) 2021.01.24 [BOJ] 계란으로 계란치기 (0) 2021.01.20 [BOJ] 청소년 상어 (0) 2021.01.19 [BOJ] 아기상어 (0) 2021.01.12