PuLP를 사용하여 ABC 219D 문제 해결(정수 계획 문제)
D - Strange Lunchbox
다음과 같이 설명하다.
D-strange Lunchbox 설명
나는 배낭 문제와 같은 맛이 난다고 생각한다. 해설에도 DP가 나온다. 최근에 파이톤이 시작한 수리가 가장 최적화된 아래의 책을 읽고 PulP로 풀어보려고 이 기사를 썼다.
PuLP는 다음과 같습니다.
main.py
from pulp import *
def solve(N, X, Y, takoyaki, taiyaki):
cand = [LpVariable('x%d' % i, cat=LpBinary) for i in range(N)] # 整数計画問題として捉える LpBinary 0 or 1
prob = LpProblem('D_Strange_Lunchbox', sense=LpMinimize)
prob += lpSum(cand) # 目的関数の設定
prob += lpDot(takoyaki, cand) >= X # 制約追加(たこ焼きの個数)
prob += lpDot(taiyaki, cand) >= Y # 制約追加(たい焼きの個数)
status = prob.solve()
if status == -1:
print("Impossible...")
else:
res = int(sum(cand[i].value() for i in range(N)))
print(f"{res}個買えばいいよ!")
total_x, total_y = 0, 0
for i in range(N):
if int(cand[i].value()) == 1:
print(f"{i+1}番目を買ってね")
total_x += takoyaki[i]
total_y += taiyaki[i]
print(f"Total takoyaki:{total_x}, Total taiyaki:{total_y}")
if __name__ == "__main__":
N = int(input())
X, Y = map(int, input().split())
takoyaki = []
taiyaki = []
for i in range(N):
n1, n2 = map(int, input().split())
takoyaki.append(n1)
taiyaki.append(n2)
solve(N, X, Y, takoyaki, taiyaki)
입력 데이터는 아래 코드로 만듭니다.import numpy as np
with open('input.txt', mode='w') as f:
f.write("100\n")
f.write("1000 1000\n")
for i in range(100):
x, y = np.random.randint(100), np.random.randint(100)
f.write(f"{x} {y}\n")
다음 명령을 사용하여 실행python main.py < input.txt
결과더 좋은 글씨가 있으면 알려주세요!!
Reference
이 문제에 관하여(PuLP를 사용하여 ABC 219D 문제 해결(정수 계획 문제)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/matsutakk/articles/327182146be79f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)