https://www.acmicpc.net/problem/2798
전수조사로 모든 합의 경우를 보는 방식으로 한다.
처은엔 i j h 의 초기식을 0으로 하고 if문을 이용하여 3개의 수가 겹치지 않게 하려고 했으나 계속해서 실패하여 초기값 세팅방식을 바꾼다.
(실패)
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
v.resize(n);
for (int i = 0; i < n; i++)
{
int k;
cin >> k;
v.push_back(k);
}
int sum;
int max = 0;
for (int i = 0; i < n; i++)
{
sum = 0;
if (i > 1)
{
for (int j = 0; j < i; j++)
{
if(j > 0){
for(int h = 0; h < j; h++){
sum = 0;
sum += v[h];
sum += v[j];
sum += v[i];
cout << sum;
if(max < sum && sum <= m)
max = sum;
}
}
}
}
}
cout << max;
return 0;
}
위 코드가 오류가 나는 이유는 벡터에 이미 resize로 벡터 크기를 설정했는데, push_back을 하면 불필요하게 공간을 늘리면서 벡터에 추가한다.
위 코드에서 불필요한 중복처리를 제거하고 입력은 어차피 3개 이상 되어있으므로 아래처럼 i j h의 초기값 세팅을 하면된다.
(성공)
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
v.resize(n);
for (int i = 0; i < n; i++)
{
int k;
cin >> k;
v[i] = k;
}
int sum;
int max = 0;
for (int i = 2; i < n; i++)
{
sum = 0;
for (int j = 1; j < i; j++)
{
for (int h = 0; h < j; h++)
{
sum = 0;
sum += v[h];
sum += v[j];
sum += v[i];
if (max < sum && sum <= m)
max = sum;
}
}
}
cout << max;
return 0;
}