PuLP를 사용하여 ABC 219D 문제 해결(정수 계획 문제)

문제는 여기에 있다
D - Strange Lunchbox
다음과 같이 설명하다.
D-strange Lunchbox 설명
나는 배낭 문제와 같은 맛이 난다고 생각한다. 해설에도 DP가 나온다. 최근에 파이톤이 시작한 수리가 가장 최적화된 아래의 책을 읽고 PulP로 풀어보려고 이 기사를 썼다.
https://www.amazon.co.jp/dp/B09G9VZ4PH/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
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
결과

더 좋은 글씨가 있으면 알려주세요!!

좋은 웹페이지 즐겨찾기