백준 29704 c++ : 배낭문제 + DP

magicdrill·2024년 11월 27일

백준 문제풀이

목록 보기
495/673

백준 29704 c++ : 배낭문제 + DP

#include <iostream>
#include <vector>

using namespace std;

void input_data(int* N, int* T, vector<pair<int, int>>& penalty, int *sum) {
	cout << "input_data()\n";
	int i, d, m;

	cin >> *N >> *T;
	for (i = 0; i < *N; i++) {
		cin >> d >> m;
		penalty.push_back({ d, m });
		*sum += m;
	}

	return;
}

int find_answer(int N, int T, vector<pair<int, int>>& penalty, int sum) {
	cout << "find_answer()\n";
	int i, j;
	vector<vector<int>> dp(N + 1, vector<int>(T + 1, 0));

	//해결할 수 있는 최대값 구해서 총합 sum에서 빼기?
	for (i = 1; i <= N; i++) {
		for (j = 1; j <= T; j++) {
			if (j - penalty[i - 1].first >= 0) {
				dp[i][j] = max(dp[i - 1][j], penalty[i - 1].second + dp[i - 1][j - penalty[i - 1].first]);
			}
			else {
				dp[i][j] = dp[i - 1][j];
			}
		}

		for (int k = 0; k <= N; k++) {
			for (int l = 0; l <= T; l++) {
				cout << dp[k][l] << " ";
			}
			cout << "\n";
		}
		cout << "\n";
	}

	return sum - dp[N][T];
}

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

	int N, T, sum = 0;
	vector<pair<int, int>> penalty;

	input_data(&N, &T, penalty, &sum);
	cout << find_answer(N, T, penalty, sum) << "\n";

	return 0;
}

0개의 댓글