[Gold IV] Title: 함께 블록 쌓기, Time: 156 ms, Memory: 34456 KB -BaekjoonHub
This commit is contained in:
46
백준/Gold/18427. 함께 블록 쌓기/README.md
Normal file
46
백준/Gold/18427. 함께 블록 쌓기/README.md
Normal 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>
|
||||
|
||||
21
백준/Gold/18427. 함께 블록 쌓기/함께 블록 쌓기.py
Normal file
21
백준/Gold/18427. 함께 블록 쌓기/함께 블록 쌓기.py
Normal 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)
|
||||
Reference in New Issue
Block a user