728x90
01knapsack
http://59.23.113.171/30stair/01knapsack/01knapsack.php?pname=01knapsack
<코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <stdio.h> int Dp[101][10010] = {}; struct jjj{ int weight; int value; }; int main(void){ int N; int jNum; jjj jew[110] = {}; scanf("%d", &N); scanf("%d", &jNum); for (int i = 0; i < jNum; i++) scanf("%d %d", &jew[i].weight, &jew[i].value); for (int i = 0; i < jNum; i++){ for (int j = 0; j <= N; j++){ if (j - jew[i].weight >= 0){ if (Dp[i][j] < jew[i].value + Dp[i][j - jew[i].weight]) Dp[i + 1][j] = jew[i].value + Dp[i][j - jew[i].weight]; else Dp[i + 1][j] = Dp[i][j]; } else Dp[i + 1][j] = Dp[i][j]; } } printf("%d\n", Dp[jNum][N]); return 0; } | cs |
<문제 푼 요령>
1. 이 문제의 중점은 차례대로 보석들을 검색하는데 그 보석을 썻을때와 안썻을때를 비교해서 가장 큰값을 비교하면 된다.
2. 2차원 Dp 테이블을 만들어서 각 테이블에 그 순서의 보석을 썻을때의 최대치 값을 쭈욱 적어놓은다.
3. 그 후 그 이전의 보석을 가졌을때의 값을 이용하여서 현재의 보석을 가졌을때의 최대치를 비교 할 수 있다.
4. 그렇게 구한 마지막인 Dp[보석수][가방무게] 가 최대값으로서 결과값을 얻을 수 있다.
728x90
'Algorithm > DP(동적 계획법)' 카테고리의 다른 글
[백준][1520번][DP] 내리막길 (8) | 2016.04.12 |
---|---|
[백준][9465번][DP] 스티커 (1) | 2016.04.12 |
[백준][2240번][DP] 자두나무 (0) | 2016.04.11 |
[백준][9095번][DP] 1,2,3 더하기 (3) | 2016.04.10 |
[백준][2294번][DP] 동전 2 (2) | 2016.04.09 |
댓글