https://www.acmicpc.net/problem/1106
1106번: 호텔
첫째 줄에 C와 형택이가 홍보할 수 있는 도시의 개수 N이 주어진다. C는 1,000보다 작거나 같은 자연수이고, N은 20보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 각 도시에서 홍보할 때
www.acmicpc.net

import java.util.*;
import java.io.*;
public class Main {
static int[][] city;
static int[] arr;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int c = Integer.parseInt(st.nextToken());//최소 고객 수
int n = Integer.parseInt(st.nextToken());//도시
city = new int[n][2];
arr = new int[c + 100];
for (int i = 1; i < c + 100; i++)
arr[i] = Integer.MAX_VALUE;
arr[0] = 0;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
city[i][0] = Integer.parseInt(st.nextToken());//cost
city[i][1] = Integer.parseInt(st.nextToken());//guest
}
Arrays.sort(city, new Comparator<int[]>() {
@Override
public int compare(int[] arg0, int[] arg1) {
// TODO Auto-generated method stub
Integer tmp = new Integer(arg0[1]);
return tmp.compareTo(arg1[1]);
}
});
for (int i = 0; i < n; i++) {
for (int j = 0; j <= c; j++) {
if (arr[j] == Integer.MAX_VALUE)
continue;
int k = 1;
int tmp;
while ((tmp = j + city[i][1] * k) <= c) {
arr[tmp] = Math.min(arr[tmp], arr[j] + city[i][0] * k);
k++;
}
if (j + city[i][1] * k > c) {
arr[c] = Math.min(arr[c], arr[j] + city[i][0] * k);
}
}
}
System.out.println(arr[c]);
}
}

처음에 재귀로 풀었다가 시간 초과나서 바텀-업 방식인 for문으로 풀었더니 해결되었다.
'baekjoon' 카테고리의 다른 글
| <java> 백준 17845 수강과목 (0) | 2022.10.07 |
|---|---|
| <java> 백준 12865 평범한 배낭 (0) | 2022.10.07 |
| <java> 백준 11057 오르막 수 (0) | 2022.10.06 |
| <java> 백준 14503 로봇 청소기 (0) | 2022.10.05 |
| <java> 백준 1240 노드사이의 거리 (0) | 2022.10.02 |