문제 링크
https://www.acmicpc.net/problem/12865
코드 구현
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N, K;
cin >> N >> K;
// dp[w] = 무게가 w일 때의 최대 가치
vector<int> dp(K + 1, 0);
for (int i = 0; i < N; i++)
{
int weight, value;
cin >> weight >> value;
for (int w = K; w >= weight; --w)
{
// 넣지 않는 경우 / 넣는 경우
dp[w] = max(dp[w], dp[w - weight] + value);
}
}
cout << dp[K] << endl;
return 0;
}
해결 방법
동적 해결법 dp 배열을 사용하여 최대 무게 K에서의 최대 가치를 배열에 저장하였다.
- 입력 받은 아이템을 넣는 경우 : dp[w-weight] + value
- 넣지 않는 경우 : dp[w] (그대로)
w를 뒤에서부터 감소시킨 이유는 중복 선택을 방지하기 위해서이다.
'개발 > 알고리즘' 카테고리의 다른 글
[프로그래머스] 길 찾기 게임(C++) (2) | 2025.05.13 |
---|---|
[백준] 회의실 배정(C++) (1) | 2025.05.12 |
[프로그래머스] n개의 최소공배수(C++) (2) | 2025.05.10 |
[프로그래머스] 전력망을 둘로 나누기(C++) (1) | 2025.05.06 |
[백준] 노드사이의 거리(C++) (1) | 2025.05.04 |