Algorithm/BOJ
[BOJ] 근손실
goakgoak
2021. 1. 20. 22:50
[18429] 근손실
www.acmicpc.net/problem/status/18429/3/1
Solution
- 가장 기본적인 백트래킹 유형이라고 할 수 있다.
- N은 물론 8이하이고, 모든 순열에 대해 문제의 조건을 충족하는 경우(근손실 없이 N개의 운동 장비를 사용할 수 있는지)만 카운트한다.
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
import 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 |
|
|
|
|
|