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 |