본문 바로가기

백트래킹

(4)
백준 16987 계란으로 계란치기 n,*l=map(int,open(0).read().split())s=l[::2] # 내구도w=l[1::2] # 무게def f(t): global r if t==n: r=max(r,sum(1for e in s if e0: # 손에 든 계란이 아니고 내구도가 남아 있을 경우 k=0 # 깨지지 않은게 있음 s[t]-=w[i] # 내구도 갱신 s[i]-=w[t] # 내구도 갱신 f(t+1) # 다음 진행 s[t]+=w[i] # 내구도 복원 s[i]+=w[t] # 내구도 복원 if k:f(n) # 모두 다 깨졌으면 마지막 처리로 ...r=0 #결과값. 최대로 깨진 계란의 수f(0)print(r) https://www.acmicpc.net/problem/16987
백준 3980 선발 명단 원문의 문제는 월드컵에서 독일팀의 라인업을 짜는 것으로 되어 있으나 ( On June 13th team Germany has its first match in the FIFA world cup against team Australia)챔스의 맨유로 바뀐 것을 보니 문제를 번역한 분이 맨유팬이 아닐까 추측해 봄... 잡설 후 본론으로 들어가 보면.각 포지션별로 1명이 들어갈 수 있으므로 0번 포지션부터 마지막 포지션까지 순회하면서(함수 재귀호출) 해당 포지션에서 능력치를 가진 선수들을 하나씩 넣었다 뺏다 하면서 계산해 가면 됨.이 때 선수는 특정 포지션에 한번만 들어가야 하므로포지션에 들어가 있는 지 아닌지 플래그 값을 가지고 있어야 함. (아래의 u: Unused 리스트)def f(x,a): # (포지션..
백준 2023 신기한 소수 왼쪽부터 1자리, 2자리, 3자리, 4자리 수 모두 소수이므로 최초 왼쪽 한자리에 소수가 가능한 2,3,5,7로 시작한다. (x 라고 설정) 그 다음에는 x * 10 + i가 소수인지 판정하면 되는데 짝수 및 5는 나누어짐으로 i는 1,3,7,9가 대상이 된다. 소수로 판정이 나면 위 작업을 해당 숫자가 N자리가 될 때 까지 반복한다. n=int(input())r=[] # result, 결과 저장용def f(x):# 재귀함수 if x//(10**(n-1)):r.append(x);return #숫자의 자리수가 n이면 결과 리스트에 추가하고 리턴for i in[1,3,7,9]: # 위에서 x * 10 + i가 소수인지 판정시 i에 해당하는 숫자 t=x*10+i # 자리수를 하나 늘림. p=1 # ..
백준 15658 연산자 끼워넣기 (2) 숫자의 배열이 n개 있을 때 연산자는 n-1개가 들어갈 수 있다.이 문제에서는 사용할 수 있는 연산자가 최대 4n개 까지 주어지기 때문에연산자 조합을 사용하여 최대값과 최소값을 찾는다.찾는 방법은 백트래킹.  n,*l=map(int,open(0).read().split())l=l[:n] # 수열s=l[n:] # 덧셈,뺄셈,곱셈,나눗셈 연산자별 사용가능 횟수y=1e9;x=-y # 최대, 최소 갱신을 위한 초기값 설정def f(i,t): # 연산자 사용횟수(n-1까지 가능), 현재까지의 계산 값 global x,y # 최대,최소값 if i==n:x=max(x,t);y=min(y,t);return # 케이스별 계산이 종료. 최대/최소 갱신. for j in range(4): # 연산자 종류별 순환 if s[..