알고리즘/백준

[백준/BOJ/1126] 같은 탑

코딩하는 회사원 2024. 5. 6. 18:08
728x90

1) 조각을 사용하지 않는 경우

2) 높은 탑에 놓는 경우

3) 낮은 탑에 놓는 경우 

 

낮은 탑에 놓는 경우는 아래 처럼 두 가지 경우로 나뉜다.

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int N, arr[51], dp[51][250001];
int dfs(int k, int diff) {
	if (diff > 250000) return -1e9;
	if (k == N) {
		if (diff == 0) return 0;
		return -1e9;
	}
	int &ret = dp[k][diff];
	if (ret != -1) return ret;
	ret = dfs(k + 1, diff); // 사용 x
	ret = max(ret, dfs(k + 1, diff + arr[k])); // 높은 탑에 놓는 경우
	if (arr[k] > diff) {
		ret = max(ret, diff + dfs(k + 1, arr[k] - diff)); // 낮은 탑1
	}
	else {
		ret = max(ret, arr[k] + dfs(k + 1, diff - arr[k])); // 낮은 탑2
	}
	return ret;
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	cin >> N;
	memset(dp, -1, sizeof(dp));
	for (int i = 0; i < N; i++) cin>>arr[i];
	int res = dfs(0, 0);
	if (res == 0) cout << "-1\n";
	else {
		cout << res << "\n";
	}
	return 0;
}
728x90