카테고리 없음

[C++ 알고리즘] 백준 14728: 벼락치기

mindun 2024. 9. 5. 15:27
반응형

 

문제 설명

 

> 가장 기본적인 냅색문제, 평범한 배낭이랑 다른게 없음

 

 

 

 

해결 전략

 

>  보통 배낭문제는 2차원 배열을 만들거나, 배열 하나를 만들거나 둘 중 하나이다.

>  배열 하나를 만드는 것이 더 시간, 공간복잡도가 좋으므로 두 번째 방법으로 만들기

 

>  배낭문제를 접근하는 요소 중 가장 중요한게, 인덱스를 '배낭의 총 무게' 라고 생각하는 것이다.

>  1차원 배열을 활용하면 같은 인덱스가 들어가므로 for문을 내림차순으로 구현 

 

#include <iostream>

int dp[10001] = {};
int k[1001] = {};
int s[1001] = {};

int main() {
	std::ios::sync_with_stdio;
	std::cin.tie(0);

	int n, t;
	std::cin >> n >> t;

	for (int i{ 1 }; i <= n; i++) {
		std::cin >> k[i] >> s[i];
	}

	for (int i{ 1 }; i <= n; i++) {
		for (int j{ t }; j >= 1; j--) {
			if (j >= k[i]) dp[j] = std::max(dp[j], dp[j - k[i]] + s[i]);
		}
	}

	std::cout << dp[t] << "\n";
}
반응형