목차

훈련

ps
링크acmicpc.net/…
출처BOJ
문제 번호31265
문제명훈련
레벨골드 2
분류

냅색

시간복잡도O(m*∑d/w)
인풋사이즈m<=10000, ∑d<=1000
사용한 언어Python 3.11
제출기록31120KB / 56ms
최고기록56ms
해결날짜2024/01/22

풀이

코드

코드 1

"""Solution code for "BOJ 31265. 훈련".

- Problem link: https://www.acmicpc.net/problem/31265
- Solution link: http://www.teferi.net/ps/problems/boj/31265

Tags: [knapsack]
"""

import sys


def main():
    N, M = [int(x) for x in sys.stdin.readline().split()]
    # pylint: disable=unused-variable
    d = [int(x) for x in sys.stdin.readline().split()]
    t = [[int(x) for x in sys.stdin.readline().split()] for _ in range(N)]

    dp = [-2] * (M + 1)
    dp[0] = -1
    for i, t_i in enumerate(t):
        for t_ij in t_i:
            for v in range(M, -1, -1):
                if v >= t_ij and dp[v - t_ij] >= i - 1:
                    dp[v] = i

    print(next((v for v in range(M, -1, -1) if dp[v] == N - 1), -1))


if __name__ == '__main__':
    main()

코드 2 - bitmask

"""Solution code for "BOJ 31265. 훈련".

- Problem link: https://www.acmicpc.net/problem/31265
- Solution link: http://www.teferi.net/ps/problems/boj/31265

Tags: [knapsack]
"""

import sys


def main():
    N, M = [int(x) for x in sys.stdin.readline().split()]
    # pylint: disable=unused-variable
    d = [int(x) for x in sys.stdin.readline().split()]
    t = [[int(x) for x in sys.stdin.readline().split()] for _ in range(N)]

    mask = (1 << (M + 1)) - 1
    dp_cur = 0b1
    for t_i in t:
        dp_prev, dp_cur = dp_cur, 0b0
        for t_ij in t_i:
            dp_cur |= ((dp_cur << t_ij) | (dp_prev << t_ij)) & mask

    print(dp_cur.bit_length() - 1 if dp_cur != 0 else '-1')


if __name__ == '__main__':
    main()