Skip to content

Commit e1bfa9d

Browse files
authored
Merge pull request #98 from YoonYn9915/main
YoonYn9915/ 11월 5주차/ 3문제
2 parents e29faa4 + 6f043ff commit e1bfa9d

File tree

3 files changed

+104
-0
lines changed

3 files changed

+104
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import sys
2+
3+
input = sys.stdin.readline
4+
N = int(input()) # 전체 인원
5+
6+
status = [list(map(int, input().split())) for _ in range(N)] # 능력치
7+
8+
visited = [False] * N
9+
result = sys.maxsize # 결과 큰 수로 초기화
10+
11+
12+
def dfs(a, idx):
13+
global result
14+
15+
if a == N // 2: # 반반으로 나뉘었을 경우
16+
17+
# 각 팀의 능력치 초기화
18+
team_start = 0
19+
team_link = 0
20+
21+
for i in range(N):
22+
for j in range(N):
23+
24+
# 방문한 반을 start 팀으로 배정
25+
if visited[i] and visited[j]:
26+
team_start += status[i][j]
27+
28+
# 방문하지 않은 반을 link 팀으로 배정
29+
elif not visited[i] and not visited[j]:
30+
team_link += status[i][j]
31+
32+
result = min(result, abs(team_start - team_link))
33+
return
34+
35+
else: # 인원 나누기
36+
for i in range(idx, N):
37+
if not visited[i]:
38+
visited[i] = True
39+
dfs(a + 1, i + 1)
40+
visited[i] = False
41+
42+
43+
dfs(0, 0)
44+
print(result)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
'''
2+
3+
1. 입력 받기
4+
2. dp에는 각 용량, 각 물건 당 넣을 수 있는 최대 가치를 저장.
5+
예) dp[1][1]은 배낭 용량이 1이고, 넣을 수 있는 물건이 1까지 일떄 가질 수 있는 최대 가치
6+
2.1 점화식을 쓰기 위해 무게순으로 물건을 오름차순 정렬해야 할 듯
7+
2.2 반복문 안에서 현재 지정된 물건을 넣는 경우와 못 넣는 경우 두가지로 분리하여 생각
8+
2.3 현재 물건을 i라고 했을 때, 점화식은 i의 가치 + dp[i-1][(배낭 용량 - i의 무게)] , dp[i-1][j]
9+
3. dp 배열 중 마지막 값, [N][K]번 요소 출력
10+
11+
'''
12+
13+
N, K = map(int, input().split())
14+
15+
arr = []
16+
17+
# 입력받기
18+
for i in range(N):
19+
W, V = map(int, input().split())
20+
arr.append([W, V])
21+
22+
# 무게순으로 물건 오름차순 정렬
23+
sorted_arr = sorted(arr, key=lambda x: x[0])
24+
25+
dp = [[0] * (K + 1) for i in range(N + 1)]
26+
27+
for i in range(N + 1):
28+
for j in range(K + 1):
29+
if i == 0 or j == 0:
30+
continue
31+
# 현재 배낭의 용량이 i번 물건을 담을 수 없는 경우
32+
if sorted_arr[i - 1][0] > j:
33+
# 이전 물건 기준 배낭의 최대 가치 그대로 가져오기
34+
dp[i][j] = dp[i - 1][j]
35+
else:
36+
# 현재 배낭의 용량이 i번 물건을 담을 수 있는 경우
37+
# 배낭에 물건을 담은 경우, 담지 않은 경우 두 가지 중 큰거 입력
38+
dp[i][j] = max(sorted_arr[i - 1][1] + dp[i - 1][j - sorted_arr[i - 1][0]], dp[i - 1][j])
39+
40+
print(dp[N][K])
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
N, K = map(int, input().split())
2+
arr = [0]
3+
dp = [[0] * (N + 1) for _ in range(K + 1)]
4+
5+
for i in range(K):
6+
importance, time = map(int, input().split())
7+
arr.append([importance, time])
8+
9+
for i in range(K+1):
10+
for j in range(N+1):
11+
if i == 0 or j == 0:
12+
continue
13+
14+
importance, time = arr[i]
15+
if time > j:
16+
dp[i][j] = dp[i - 1][j]
17+
else:
18+
dp[i][j] = max(importance + dp[i - 1][j - time], dp[i - 1][j])
19+
20+
print(dp[K][N])

0 commit comments

Comments
 (0)