다음과 같이 여러 단위의 동전들이 주어져 있을때 거스름돈을 가장 적은 수의 동전으로 교환
해주려면 어떻게 주면 되는가? 각 단위의 동전은 무한정 쓸 수 있다.
▣ 입력설명
첫 번째 줄에는 동전의 종류개수 N(1<=N<=12)이 주어진다. 두 번째 줄에는 N개의 동전의 종
류가 주어지고, 그 다음줄에 거슬러 줄 금액 M(1<=M<=500)이 주어진다.
각 동전의 종류는 100원을 넘지 않는다.
▣ 출력설명
첫 번째 줄에 거슬러 줄 동전의 최소개수를 출력한다.
▣ 입력예제 1
3
1 2 5
15
▣ 출력예제 1
3
설명 : 5 5 5 동전 3개로 거슬러 줄 수 있다.
def DFS(x,s):
if s==m:
print(x)
sys.exit(0)
else :
for i in range(n) :
DFS(x+1,s+k[i])
if __name__=='__main__' :
n=int(input())
k=list(map(int, input().split()))
m=int(input())
DFS(0,0,)
-1이 15개로 되는 경우만 나온다
==>다른 방법으로도 도전해봤는데 여전히 15가 나온다, 어떤 부분이 문제일까
def DFS(x):
global min
if x==m:
if sum(res)==m:
if min>x:
min=x
return
else :
for i in range(n) :
DFS(x+1)
res[x]=k[i]
if __name__=='__main__' :
n=int(input())
k=list(map(int, input().split()))
m=int(input())
min=900
res=[0]*m
DFS(0)
print(min)
====>무엇이 문제였나면 입력값이 1,2,5였다
이렇게 되면 dfs가 돌 때 1부터 쭉쭉쭉 보면서 도는 것이라서 가장 처음 만나는 애가 15인 것이다 (1이 15개 인거)그래서 입력값을 반대로 해주면 5,2,1 부터 되고 가장 최소의 개수만으로 15합 달성해내는 애가 도출된다 ===> 그런데 위 코드처럼 해도 계속recursion error가 난다, 첫번째 예시입력값에서만 적용됨
<강의를 듣고 얻은 힌트로 얻은 최종풀이>
def DFS(x,s):
if s==m:
print(x)
sys.exit(0)
if s>m:
return
else :
for i in range(n) :
DFS(x+1,s+k[i])
if __name__=='__main__' :
n=int(input())
k=list(map(int, input().split()))
m=int(input())
k.sort(reverse=True)
DFS(0,0)
(1) - 근데 이건 시간 초과 걸린다
def DFS(L, sum):
global res
if sum>m:
return
if sum==m:
if L<res:
res=L
else:
for i in range(n):
DFS(L+1, sum+a[i])
if __name__=="__main__":
n=int(input())
a=list(map(int, input().split()))
m=int(input())
res=2147000000
a.sort(reverse=True)
DFS(0, 0)
print(res)
(2) 따라서 더 뭔가를 가지쳐줘야 한다
def DFS(L, sum):
global res
if sum>m:
return
if L>res: #이 부분만 추가해주면 시간이 엄청 줄어든다
return
if sum==m:
if L<res:
res=L
else:
for i in range(n):
DFS(L+1, sum+a[i])
if __name__=="__main__":
n=int(input())
a=list(map(int, input().split()))
m=int(input())
res=2147000000
a.sort(reverse=True)
DFS(0, 0)
print(res)