Skip to content

Commit c2c5a31

Browse files
committed
AC(2300ms): #dp O(N C^2)
시간 복잡도 정정하려고 만든 커밋입니다.
1 parent 2aef1e0 commit c2c5a31

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

2주차 Knapsack/김동주/boj_1106.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66

77

88
C, N = map(int, sys.stdin.readline().split())
9-
unit_price = [None] * N
10-
unit_amount = [None] * N
9+
group_cost = [None] * N
10+
group_size = [None] * N
1111
for i in range(N):
12-
unit_price[i], unit_amount[i] = map(int, sys.stdin.readline().split())
12+
group_cost[i], group_size[i] = map(int, sys.stdin.readline().split())
1313

1414

1515
@cache
@@ -19,18 +19,20 @@ def find_min_price(i = 0, c = C) -> int:
1919
# C명을 유치했으므로, 이제 더 비용을 안 소모해도 됨.
2020
return 0
2121

22-
min_price = sys.maxsize
23-
max_n_units = math.ceil(c / unit_amount[i]) # 적어도 c명을 유치하기 위해 투자해야 하는 최소 횟수
22+
min_cost = sys.maxsize
23+
max_possible_groups = math.ceil(c / group_size[i]) # 적어도 c명을 유치하기 위해 투자해야 하는 최소 횟수
2424

2525
if i == N-1:
2626
# i번째 도시가 마지막 도시이면 선택권이 없이 투자에 올인 해야한다.
27-
return max_n_units * unit_price[i]
28-
29-
for n_units in range(max_n_units+1):
30-
price = find_min_price(i+1, c - n_units * unit_amount[i]) + n_units * unit_price[i]
31-
if min_price > price:
32-
min_price = price
33-
return min_price
27+
return max_possible_groups * group_cost[i]
28+
29+
# 0 부터 max_possible_groups 번까지 투자해보면서 최소 비용을 찾는다.
30+
for n_groups in range(max_possible_groups+1):
31+
# i번째 도시에 n_groups 번 투자하는 경우:
32+
cost = find_min_price(i+1, c - n_groups * group_size[i]) + n_groups * group_cost[i]
33+
if min_cost > cost:
34+
min_cost = cost
35+
return min_cost
3436

3537

3638
print(find_min_price())

0 commit comments

Comments
 (0)