728x90
https://www.acmicpc.net/problem/2629
2629번: 양팔저울
첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은 무게의 추가 여러 개 있을 수도 있다. 추의 무
www.acmicpc.net
1. 문제 설명
양팔 저울을 이용해 주어진 추로 특정 무게를 만드는 문제이다.
추를 사횽해 무게를 만드는 방법은 3가지 이다.
- 추의 무게를 더한다.
- 추의 무게를 뺀다.
- 추를 사용하지 않는다.
위 3가지 규칙으로 만들 수 있는 모든 무게를 dp에 저장한다.
재귀를 사용해서 코드를 작성했다.
2. 코드 설명
n = int(input())
weight = list(map(int, input().split()))
m = int(input())
glass = list(map(int, input().split()))
dp = [[0 for j in range((i+1)*500+1)] for i in range(n+1)]
def cal(num, w):
if num > n:
return
if dp[num][w]:
return
dp[num][w] = 1
cal(num+1, w)
cal(num+1, w+weight[num-1])
cal(num+1, abs(w-weight[num-1]))
cal(0, 0)
for i in glass:
if i > 15000:
print('N', end=' ')
elif dp[n][i] == 1:
print('Y', end=' ')
else:
print('N', end=' ')
추의 개수가 많아질수록 한 번에 재귀를 3번 호출하는 것은 성능 문제를 초래할 수 있다.
따라서 dp를 2차원 배열로 만들어 추의 개수별로 만들 수 있는 무게 리스트를 만든다.
이미 같은 추의 개수로 똑같은 무게를 만들었다면,
다음 과정을 같으므로 함수를 return하면 된다.
728x90
'Programming > python' 카테고리의 다른 글
백준 2206 : 벽 부수고 이동하기 [파이썬] (0) | 2023.02.25 |
---|---|
백준 2293 : 동전 1 [파이썬] (0) | 2023.02.13 |
백준 14503 : 로봇 청소기 [파이썬] (0) | 2023.02.09 |
백준 1520 : 내리막 길 [파이썬] (0) | 2023.02.08 |
백준 12015 : 가장 긴 증가하는 부분수열 2 [파이썬] (0) | 2023.02.07 |