문제
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net
문제 풀이
#include <iostream>
using namespace std;
int n, k;
int w[100001] = { 0, };
int v[1001] = { 0, };
int dp[101][100001] = { 0, };
int main() {
//물품의 수 N과 준서가 버틸수있는 무게 K주어진다
//두번째 줄부터, N개의 줄에 거쳐 각 물건의 무게 W와 해당 물건의 가치V가 주어진다
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> w[i] >> v[i];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
//dp[i][j] : i번째 물건까지 최대 j무게까지 가능할 때 최고의 가치값
if (w[i] <= j) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
else {
dp[i][j] = dp[i - 1][j];
}
}
}
cout << dp[n][k];
return 0;
}
profit 값 dp[i][j] : item i까지 무게 j까지 채워놓는 배열.
if (w[i] <= j) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
전에 채운 profit보다 현재 item i를 채운 profit이 더 크면 update한다.
'programming language > Algorithm' 카테고리의 다른 글
[Divide and Conquer 예제] 프로그래머스 Level2 타겟넘버 (0) | 2021.08.25 |
---|---|
Branch and Bound (0) | 2021.08.20 |
[Backtracking 예제] 백준 9663 N-Queens (0) | 2021.08.19 |
[Greedy Approach 예제] 백준 2839 설탕배달 (0) | 2021.08.19 |
Backtracking (0) | 2021.08.19 |