상태 의미를 문장으로 쓴다
dp[i]가 i번째까지의 최댓값인지, i를 마지막으로 쓰는 값인지에 따라 전이가 달라진다.
DP 배열 차원은 문제 이름이 아니라 점화식이 참조하는 상태 수가 결정한다. 이전 i만 보면 1차원, 두 축의 독립 선택이 필요하면 2차원이 된다.
dp[i]가 i번째까지의 최댓값인지, i를 마지막으로 쓰는 값인지에 따라 전이가 달라진다.
전이가 i-1만 보면 1차원, i와 j 두 선택을 모두 보면 2차원이 자연스럽다.
현재 상태가 참조하는 이전 상태가 이미 채워져 있어야 한다.
for (auto item : items) {
for (int w = W; w >= item.weight; --w) {
dp[w] = std::max(dp[w], dp[w - item.weight] + item.value);
}
}