Skip to content

Brute Force Knapsack Problem

Published: at 오후 12:24

Table of contents

Open Table of contents

python 코드

import time, unittest
from itertools import combinations


def get_max_value(items, limit_weight):
    max_value = -1
    items_size = len(items)
    # nCr에서 r을 1부터 n까지 증가시키면서 nCr을 구한다.
    for r in range(1, items_size + 1):
        comb_candidates = combinations(items, r)
        for candidate in comb_candidates:
            candidate_weight = sum([item[0] for item in candidate])
            candidate_value = sum([item[1] for item in candidate])
            if candidate_weight <= limit_weight and max_value < candidate_value:
                # max_value를 갱신한다.
                max_value = candidate_value
    return max_value


class KnapsackTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        # input.txt를 읽기
        # 첫 줄에는 물건의 개수 N과 최대 무게 K가 주어진다.
        # 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W와 해당 물건의 가치 V가 주어진다.
        cls.N, cls.K = map(int, input().split())
        # (W, V) 튜플이 담긴 리스트
        cls.items = [tuple(map(int, input().split())) for _ in range(cls.N)]
        print("Brute Force Knapsack 테스트 시작")

    @classmethod
    def tearDownClass(cls) -> None:
        print("\nBrute Force Knapsack 테스트 종료\n")
        print(f"물건의 개수: {cls.N}")
        print(f"최대 무게: {cls.K}")
        print(f"물건의 무게와 가치: {cls.items}")
        print(f"최대 가치: {get_max_value(cls.items, cls.K)}")

    def setUp(self) -> None:
        self.start_time = time.time()

    def tearDown(self) -> None:
        self.end_time = time.time()
        print(
            f"\nget_max_value 함수 소요 시간: {self.test_function_end_time - self.test_function_start_time:4f}s"
        )
        print(f"테스트 자체의 소요 시간: {self.end_time - self.start_time:4f}s")

    def test_tsp(self):
        self.test_function_start_time = time.time()
        res = get_max_value(KnapsackTest.items, KnapsackTest.K)
        self.test_function_end_time = time.time()
        self.assertEqual(res, 14)


if __name__ == "__main__":
    unittest.main(verbosity=2)

How to Run

python version: 3.11.6

Run main.py

pip install pipenv
pipenv --python 3.11.6
pipenv run python3 main.py < input.txt

Input

input.txt:

4 7
6 13
4 8
3 6
5 12

Output:

Loading .env environment variables...
Brute Force Knapsack 테스트 시작
test_tsp (__main__.KnapsackTest.test_tsp) ...
get_max_value 함수 소요 시간: 0.000028s
테스트 자체의 소요 시간: 0.000050s
ok

Brute Force Knapsack 테스트 종료

물건의 개수: 4
최대 무게: 7
물건의 무게와 가치: [(6, 13), (4, 8), (3, 6), (5, 12)]
최대 가치: 14

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Execution Image