[python] 동적 계획법의 예시

가방에 넣을 수 있는 최대 무게가 정해져 있는 상황을 가정해봅시다. 우리는 다양한 물건들이 있고, 각 물건은 무게와 가치를 가지고 있습니다. 가방에 넣을 수 있는 최대 가치를 구하기 위해서는 어떤 물건을 넣어야 할지를 결정해야 합니다.

이 문제를 동적 계획법으로 해결하기 위해서는 작은 하위 문제로 나누어 풀어야 합니다. 우리는 각 물건마다 넣을지 말지를 결정하고, 가방에 넣을 수 있는 무게가 증가할 때마다 최대 가치를 계산하여 저장합니다. 그리고 물건을 하나씩 추가할 때마다 이전에 계산한 최대 가치와 비교하여 더 큰 값을 저장합니다. 이렇게 하면 가방에 넣을 수 있는 최대 가치를 구할 수 있습니다.

아래는 파이썬으로 동적 계획법을 구현한 예시 코드입니다.

def knapsack(items, max_weight):
    n = len(items)
    dp = [[0] * (max_weight+1) for _ in range(n+1)]

    for i in range(1, n+1):
        for w in range(1, max_weight+1):
            if items[i-1][0] <= w:
                dp[i][w] = max(dp[i-1][w], items[i-1][1] + dp[i-1][w-items[i-1][0]])
            else:
                dp[i][w] = dp[i-1][w]

    return dp[n][max_weight]

items = [(2, 3), (3, 4), (4, 5), (5, 8), (9, 10)]
max_weight = 10

max_value = knapsack(items, max_weight)
print("가방에 넣을 수 있는 최대 가치:", max_value)

위 코드는 각 물건의 무게와 가치를 items 리스트에 저장하고, knapsack 함수를 통해 가방에 넣을 수 있는 최대 가치를 구합니다. 이를 위해 dp 리스트를 생성하고, 반복문을 통해 각 물건을 고려한 최대 가치를 계산하여 저장합니다. 마지막으로 dp[n][max_weight] 값을 반환하여 가방에 넣을 수 있는 최대 가치를 출력합니다.

이와 같이 동적 계획법은 작은 하위 문제들을 해결하고 최적해를 구함으로써 큰 문제를 해결할 수 있는 효율적인 방법입니다. 프로그래밍에서는 다양한 최적화 문제에서 동적 계획법을 활용할 수 있으며, 이를 통해 실행 시간을 줄이고 최적해를 구할 수 있습니다.

참고 문헌: