chabt   4년 전

for(int i=1; i<=N; i++) {
   for(int j=K; j>=W[i]; j--) {
      dp[j] = Math.max(dp[j], dp[j-W[i]] + V[i]);
   }
}

위 소스와 아래 소스에 어떤 차이가 있을까요 ?
저는 차이점을 모르겠는데, 
위에 거는 맞고, 아래 거는 오류가 발생하네요.  잘 이해가 안되요. 어떤 반례가 있을까요 ?

for(int i=1; i<=N; i++) {
   for(int j=W[i]; j<=K; j++) {
      dp[j] = Math.max(dp[j], dp[j-W[i]] + V[i]);
   }
}

3587jjh   4년 전

dp테이블을 채우는 방향이 반대입니다.

dp[j-W[i]]의 값이 사전에 계산이 되어있는지 안되어있는지를 생각하면서 채워야합니다.

3587jjh   4년 전

이 문제의 경우는 이전 단계의 값 dp[j-W[i]]를 이용해야하는데 j를 오름차순으로 순회할 경우 현재 단계의 값이 담겨져 있게 되므로 정보를 잘못 이용하게 됩니다

chabt   4년 전

조언 감사드립니다. 

배낭에서 고려해야 할 케이스가 많네요.

물건이 1개씩만 있을때, 무제한 있을때, N개씩 있을때 등등...

여기서는 1개씩만 있을 경우이고, 앞에서 부터 시작하면 중복이 발생하므로, 뒤에서 부터 해야 하는 거네요.

제가 쓴 방법은 무제한일 때인 경우네요. 

감사합니다.

댓글을 작성하려면 로그인해야 합니다.