어흥

[백준 12865] 평범한 배낭 (C++) 본문

알고리즘/백준

[백준 12865] 평범한 배낭 (C++)

라이언납시오 2020. 4. 19. 14:49
728x90
반응형

문제 링크: 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. 주의할 점

- Greedy를 이용한 방법으로 하지 말것(TC부터 답이 틀릴것이다)

- Knapsack 알고리즘에 대해 알고 있어야 한다

 

2. 구현

- Dp[][]배열을 전부 -1로 초기화한다

- Arr[][]배열을 통해 각 물건의 무게, 가치를 저장한다

- Dp[][]배열을 통해 해당 Idx전까지 Remain만큼의 양을 남기고 가치의 최대값을 구한적이 있는 경우, 재사용한다(시간 절약 -> TLE발생 x)

- Idx번째에 있는 물건을 추가할 만큼 공간이 남아있다면 물건을 추가하고, 추가하지 않고 그냥 넘어간것과 비교하여 DP를 갱신한다

- Temp와 Result를 비교하여, Result에는 가방에 채울 수 있는 최대의 가치가 들어가도록 한다(가방의 무게와 물건 무게들의 합이 딱 맞아 떨어지지 않는 경우를 대비하여 매번 초기화 한다)

 

#include <iostream>
#include <algorithm>
using namespace std;
long long dp[100][100001], result = 0;
int arr[100][2];		//무게, 가치
int num, weight;

long long knapsack(int idx, int remain) {
	if (idx == num) return 0;
	long long temp = dp[idx][remain];
	if (temp != -1) return temp;
	if (arr[idx][0] <= remain) 		//추가 가능
		temp = knapsack(idx + 1, remain - arr[idx][0]) + arr[idx][1];
	temp = max(temp, knapsack(idx + 1, remain));
	result = max(result, temp);
	return dp[idx][remain] = temp;
}

int main() {
	cin >> num >> weight;
	for (int i = 0; i < num; i++) {
		cin >> arr[i][0] >> arr[i][1];
		for (int j = 0; j <= weight; j++)
			dp[i][j] = -1;
	}
	knapsack(0, weight);
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1963] 소수 경로 (C++)  (0) 2020.04.20
[백준 1806] 부분합 (C++)  (0) 2020.04.19
[백준 2239] 스도쿠 (C++)  (0) 2020.04.19
[백준 1647] 도시 분할 계획 (C++)  (0) 2020.04.18
[백준 2665] 미로만들기 (C++)  (0) 2020.04.18
Comments