S = {item1,item2 ... }
Wi = item의 무게
Pi = item의 가치
W = 배낭에 넣을 수 있는 최대 무게
무게가 넘지 않으면서 가치가 최대가 되도록 A를 결정
=> 값어치를 기준으로 했을 때 최적이 아님..
=> 다이나믹 알고리즘으로 풀어야해
- 아이템이 4개가 있다고 가정
Wi가 배낭 용량을 넘지는 않을때 가방에 넣는걸 시도 할 수 있어
max(첫번째가 실패한 상황, 두번째가 성공한 상황)
배낭 용량이 w니까 나머지 여유는 [w-wi]. 최고로 잘 채워졌을때는 [i-1].
pi랑 wi는 입력으로 주어짐
근데 둘은 아무 상관관계가 없자나..
최악의 경우를 따지면 성능이 brute force만 못해
=> 다 계산 안하고 필요한 것만 계산해서 성능을 높이자!!
원래대로 했으면 3 * 30 해야하는데
필요한것만 계산하면 7 번만 하면됨
=> Top-Down 으로 원하는거만 접근 -> D.C
D.C의 단점을 보완하기 위해 한번 계산을 해놓은거는 어딘가에다가 저장을 해놔 = Dynamic Programming memorization 기법(DP인데 Top-down)
답이 저장소에 있으면 참조하고, 호출 X하자
최악의 경우는 O(2^n). Brute force는 항상 (2^n)인데 DP는 최악의 경우가 이거임. 더 낫다