본문 바로가기

다이나믹 프로그래밍

평범한 배낭(knapsack)

https://www.acmicpc.net/problem/12865

 

12865번: 평범한 배낭

첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)

www.acmicpc.net

 

다이나믹 프로그래밍의 정석 문제

점화식을 세우지 못하면 문제를 풀 수 없다..

 

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
39
40
#include <iostream>
using namespace std;
 
struct Thing{
    int weight, val;
};
 
int value[101][100001], n, k;
Thing thing[101];
 
int main(){
    cin >> n >> k;
  
      //물건들의 무게와 가치(w, v)를 입력받는다.
    for(int i = 1 ; i<=n ; i++){
        int w, v;
        cin >> w >> v;
        thing[i] = {w, v};
    }
  
      //다이나믹 프로그래밍
    for(int i = 1 ; i<=n ; i++){
        for(int j = 1 ; j<=k ; j++){
            int wi = thing[i].weight;
            int vi = thing[i].val;
  
            //i 번째 물체의 무게를 포함할 수 없는 경우
            if(wi > j){
                value[i][j] = value[i-1][j];
            }//i 번째 물체의 무게를 배낭의 용량(k)가 포함할 수 있는 경우
              else{
                value[i][j] = max(value[i-1][j], vi+value[i-1][j-wi]);
            }
            
        }
    }
    cout << value[n][k];
    return 0;
}
 
cs

'다이나믹 프로그래밍' 카테고리의 다른 글

내리막 길  (0) 2023.07.04
이항 계수  (0) 2023.06.21
가장 큰 정사각형  (0) 2023.05.19
계단 오르기  (0) 2023.03.30
연속합 2 (중요!)  (0) 2023.03.30