백준 12865 c++

magicdrill·2024년 4월 8일

백준 문제풀이

목록 보기
273/673

백준 12865 c++

#include <iostream>
#include <algorithm>

using namespace std;

int input(int lower, int upper)
{
	//cout << "input()" << endl;
	int A;

	while (1)
	{
		cin >> A;
		if (A >= lower && A <= upper)
		{
			break;
		}
		else
		{
			;
		}
	}

	return A;
}

void input_array(int *W, int *V, int N)
{
	int i;
	
	for (i = 1; i < N + 1; i++)
	{
		W[i] = input(1, 100000);
		V[i] = input(0, 1000); //입력값 주의
	}

	return;
}

int find_result(int* W, int* V, int N, int K)
{
	int i, j, result = 0;;
	int** DP = new int* [N+1];
	for (i = 0; i < N + 1; i++)
	{
		DP[i] = new int[K + 1] { 0, 0, };
	}

	for (i = 1; i < N + 1; i++)
	{
		for (j = 1; j < K + 1; j++)
		{
			if (j >= W[i])
			{
				DP[i][j] = max(DP[i-1][j], DP[i-1][j-W[i]] + V[i]);
			}
			else
			{
				DP[i][j] = DP[i - 1][j];
			}
		}
	}
	/*for (i = 0; i < N + 1; i++)
	{
		for (j = 0; j < K + 1; j++)
		{
			cout << DP[i][j] << " ";
		}
		cout << "\n";
	}*/
	result = DP[N][K];

	for (i = 0; i < N + 1; i++)
	{
		delete[] DP[i];
	}
	delete[] DP;

	return result;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, K;
	int* W;
	int* V;

	N = input(1, 100);
	K = input(1, 100000);
	W = new int[N + 1] {0};
	V = new int[N + 1] {0};
	input_array(W, V, N);
	cout << find_result(W, V, N, K) << "\n";

	delete[] W;
	delete[] V;

	return 0;
}

0개의 댓글