알고리즘 알고파! 알고라파덕
안녕하세요~ 알고라파덕입니다!
이번 10번 문제는 PACKING이라는 문제입니다.!!
이 문제는 동적계획법 대표 문제입니다. 가방 문제라고도 불리구요!
- 문제 개요
- 문제 풀이
점화식 1번 : sum[i-1][data[i].volume]과 data[i].value 비교
sum[i-1][data[i].volume] < data[i].value => sum[i][data[i].volume] = data[i].value
뜻 : i번째 부피와 i번 이전까지의 물품들을 조합해서 만든 부피가 같은 곳에서 이전까지의 물품들의
가중치 합이 i번째 물건 가중치보다 작은 경우에는 i번째 물건을 넣어 가중치를 높인다.
sum[][]배열을 바로 위 칸의 값을 가지고와 정보를 누적한다.
점화식 2번 sum[i-1][j]가 존재하고 sum[i-1][j] + data[i].value > sum[i][j+data[i].volume]이고 j+data[i].volume <= 총용량 일 경우에는
sum[i][j+data[i].volume] = sum[i-1][j] + data[i].value
뜻 : i 이전까지의 물건들을 사용하여 만든 부피에서 i번째 물건을 넣는다고 할 때, i전까지의 물건들을 사용하여 똑같은 부피를 만든 것 보다 가중치가 높으면 가중치를 바꿔준다.
이 2점화식을 반복해주면 마지막 줄에는 부피마다 최대값을 구할 수 있다.
그래서 마지막 줄에서 가장 최대인값을 출력을 하면 최대 절박도가 나온다.
재귀함수 추적부분
추적 방법으로는 점화식 1번이나 2번을 사용하여 물건을 가방에 집어넣을 때, 추적 배열을 하나
생성하여 그 칸에 물건의 부피 값을 넣어둔다.
그렇게 되면 왼쪽과 같은 추적배열이 만들어지는데 여기서 최대값이 나왔던 지점에서
재귀함수로 역추적을 한다. 동그라미친 (6,10) 번째에서 시작을 한다.
0이라는 것은 물건을 사용하지 않은 것이므로 바로 위칸으로 올라가고
0이 아니라는 것은 그 부피의 물건을 사용한것이므로 윗 행의 부피값 만큼 왼쪽인 곳으로 올라간다.
그런방법으로 행번호가 1보다 작게되면 리턴을 하면서 값어치가 있던 부분의 문자열을 출력한다.
동적계획법도 시험이 끝나는대로 설명을 올리도록 하겠습니다~!
'알고스팟 풀이 > 동적계획법' 카테고리의 다른 글
[알고스팟/ALGOSPOT] 17. TILING2 (0) | 2015.07.01 |
---|---|
[알고스팟/ALGOSPOT] 16. JLIS (0) | 2015.06.25 |
[알고스팟/ALGOSPOT] 15. LIS (0) | 2015.06.23 |
[알고스팟/ALGOSPOT] 14. TRIANGLEPATH (0) | 2015.06.23 |
[알고스팟/ALGOSPOT] 8. CONCERT (0) | 2014.12.07 |