[Gold IV] Title: 함께 블록 쌓기, Time: 156 ms, Memory: 34456 KB -BaekjoonHub

This commit is contained in:
SSUM
2025-04-03 14:43:06 +09:00
parent a1869b864d
commit 8809b97718
2 changed files with 67 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
# [Gold IV] 함께 블록 쌓기 - 18427
[문제 링크](https://www.acmicpc.net/problem/18427)
### 성능 요약
메모리: 34456 KB, 시간: 156 ms
### 분류
다이나믹 프로그래밍, 배낭 문제
### 제출 일자
2025년 4월 2일 03:33:13
### 문제 설명
<p>1번부터 <em>N</em>번까지의 학생들은 각각 블록들을 가지고 있다. 학생마다 최대 <em>M</em>개의 블록을 가지고 있을 수 있으며, 한 명의 학생이 가지고 있는 모든 블록들의 높이는 서로 다르다. 이 때 1번부터 N번까지의 학생들이 가진 블록을 차례대로 사용하여 바닥에서부터 쌓아올려 하나의 탑을 만들고자 한다.</p>
<p>단, 어떤 학생의 블록은 사용하지 않아도 되며 한 학생당 최대 1개의 블록만을 사용할 수 있다.</p>
<p>1번부터 <em>N</em>번까지의 학생들이 가지고 있는 블록들에 대한 정보가 주어졌을 때, 높이가 정확히 <em>H</em>인 탑을 만들 수 있는 경우의 수를 계산하는 프로그램을 작성하시오.</p>
<p>예를 들어 <em>N</em>=3, <em>M</em>=3, <em>H</em>=5일 때, 각 학생마다 가지고 있는 블록들의 높이가 다음과 같다고 가정하자.</p>
<ul>
<li>1번 학생: 2, 3, 5</li>
<li>2번 학생: 3, 5</li>
<li>3번 학생: 1, 2, 3</li>
</ul>
<p>이 때, 탑의 높이가 정확히 5가 되도록 블록을 쌓는 경우로는 다음의 6가지가 존재한다. (블록을 사용하지 않는 경우는 X로 표시하였다.)</p>
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/82b228be-4bf3-4a38-95e3-a2238e9bb4ff/-/preview/" style="height: 314px; width: 340px;"></p>
### 입력
<p>첫째 줄에 자연수 <em>N</em>, <em>M</em>, <em>H</em>가 공백을 기준으로 구분되어 주어진다. (1 ≤ <em>N </em>≤ 50, 1 ≤ <em>M </em>≤ 10, 1 ≤ <em>H </em>≤ 1,000) 둘째 줄부터 <em>N</em>개의 줄에 걸쳐서 각 학생이 가진 블록들의 높이가 공백을 기준으로 구분되어 주어진다.</p>
<p>단, 모든 블록의 높이는 1,000 이하의 자연수이며 한 명의 학생이 가지고 있는 모든 블록들의 높이는 서로 다르게 주어진다.</p>
### 출력
<p>첫째 줄에 높이가 <em>H</em>인 탑을 만드는 경우의 수를 10,007로 나눈 나머지를 출력한다.</p>

View File

@@ -0,0 +1,21 @@
import sys
input = sys.stdin.readline
n, m, h = map(int, input().split())
backpack = []
for _ in range(n):
backpack.append(list(map(int, input().split())))
dp_table = [[0 for _ in range(h+1)] for _ in range(n+1)]
dp_table[0][0] = 1
for i in range(1, n+1):
for j in range(h+1):
dp_table[i][j] += dp_table[i-1][j]
for k in backpack[i-1]:
for l in range(h, k-1, -1):
dp_table[i][l] += dp_table[i-1][l-k]
print(dp_table[n][h]%10007)