본문 바로가기

백준/다이나믹 프로그래밍

평범한 배낭

728x90

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

#include<iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int arr[101][100001];
int main() {
	int n;
	int weight;
	cin >> n;
	cin >> weight;
	memset(arr, 0, sizeof(arr));
	vector<pair<int,int>>things(100);


	for (int i = 1; i <= n; i++) {
		int w, v;
		cin >> w;
		cin >> v;
		things[i].first = w;
		things[i].second = v;
	
	}

	for(int i=1; i<=n; i++){
	
		int w,v;
		w = things[i].first;
		v = things[i].second;
		for (int j = 1; j <= weight; j++) {
			
			if (j >= things[i].first) {
				arr[i][j] = max(arr[i - 1][j], arr[i - 1][j - w] + v);
				//기존에 있는 값과 새로운 값을 서로 비교를 한다.
			}
			else {
				arr[i][j] = arr[i - 1][j];
			}
		}
	
	 }

	cout << arr[n][weight] << endl;



}

weight가 가로 입력받은 값(w,v)이 세로로 해서 2차원 배열에 메모이제이션을 하면서 푸는 문제이다. 입력받은 값을 세로로 취급하는 점에서 생각하지 못했던 부분인것 같다. 

'백준 > 다이나믹 프로그래밍' 카테고리의 다른 글

기타리스트  (0) 2021.02.21
뮤탈리스크  (0) 2021.02.19
파일 합치기  (0) 2021.01.22
1,2,3 더하기 4  (0) 2021.01.21
팰린드롬?  (0) 2021.01.20