본문 바로가기
문제/백준

c++_백준_12865_"평범한 배낭"

by 나 진짜 못차마 2023. 6. 11.
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

 

범위가 넓어 DP를 이용하여 해결하였다.

역시 DP는 골드 5라도 나에게

난이도가 너무 높다.

 

물품의 수를 i,

무게를 j

라고 두어

0~i (N) 개,

0~ j (K)무게

로 지정했다.

코드를 보면 알겠지만

주로 봐야할 부분은

weight[i] <= j 일 때이다.

예를 들어

j = 7,

weight[i] = 5 라면

즉, 한 물품의 무게가 5 라면

DP[i-1][j - weight[i]] + value[i] 의 의미는

무게가 (7 -5) 2일 때 최고의 가치 + i 의 현재 가치(현재 행의 가치)

DP[i-1][j] : 이전 검사했던 j 무게 중 가장 높은 가치

중 가치가 높은 것을

DP[i][j] 넣었다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N, K;

int weight[101];
int value[101];

int DP[101][100001];

void find_total() {

	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= K; j++) {
			if (weight[i] <= j)
				DP[i][j] = max(DP[i - 1][j], DP[i - 1][j - weight[i]] + value[i]);
			else
				DP[i][j] = DP[i - 1][j];
		}
	}
	
	cout << DP[N][K];
}

int main(void) {

	cin >> N >> K;

	for (int i = 1; i <= N; i++) {
		cin >> weight[i] >> value[i];
	}

	find_total();

}

728x90

'문제 > 백준' 카테고리의 다른 글

c++ 백준_1245_"농장 관리"  (0) 2023.06.11
C++ 백준_1629_"곱셈"  (0) 2023.06.11
c++ 백준_15663_"N과 M (9)"  (0) 2023.06.11
c++ 백준_11660_"구간 합 구하기 5"  (0) 2023.06.11
c++ 백준_5430_"AC"  (0) 2023.06.11