반응형
M개씩 뽑은 후에, 그 차례에서 그룹별로 최대 값 연산 수행 후 그 합의 비교를 수행해야 함.
#include<iostream>
#include<vector>
#include<string.h>
#include<cmath>
using namespace std;
int N, M, C;
int arr[10][10];
bool visit[10][10];
vector<int> a;
vector<int> b;
vector<int> sela;
vector<int> selb;
int maxa;
int maxb;
int result;
void finda(int idx, int cur)
{
if (sela.size() == cur)
{
int cost = 0;
for (int i = 0; i < cur; i++)
{
cost += sela[i];
}
if (cost > C)
{
return;
}
cost = 0;
for (int i = 0; i < cur; i++)
{
cost += pow(sela[i],2);
}
if (maxa < cost)
{
maxa = cost;
}
return;
}
for (int i = idx + 1; i < a.size(); i++)
{
sela.push_back(a[i]);
finda(i, cur);
sela.pop_back();
}
}
void findb(int idx, int cur)
{
if (selb.size() == cur)
{
int cost = 0;
for (int i = 0; i < cur; i++)
{
cost += selb[i];
}
if (cost > C)
{
return;
}
cost = 0;
for (int i = 0; i < cur; i++)
{
cost += pow(selb[i], 2);
}
if (maxb < cost)
{
maxb = cost;
}
return;
}
for (int i = idx + 1; i < b.size(); i++)
{
selb.push_back(b[i]);
findb(i, cur);
selb.pop_back();
}
}
void start()
{
int sizea = a.size();
int sizeb = b.size();
maxa = 0;
maxb = 0;
for (int i = 1; i <= sizea; i++)
{
for (int j = 0; j < sizea; j++)
{
sela.push_back(a[j]);
finda(j, i);
sela.pop_back();
}
}
for (int i = 1; i <= sizeb; i++)
{
for (int j = 0; j < sizeb; j++)
{
selb.push_back(b[j]);
findb(j, i);
selb.pop_back();
}
}
if (result < maxa + maxb)
{
result = maxa + maxb;
}
}
int main(int argc, char** argv)
{
int test_case;
int T;
cin >> T;
/*
여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
*/
for (test_case = 1; test_case <= T; ++test_case)
{
cin >> N >> M >> C;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> arr[i][j];
}
}
memset(visit, 0, sizeof(visit));
result = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (!visit[i][j] && j + M - 1 < N)
{
if (!visit[i][j + M - 1])
{
for (int k = j; k <= j + M - 1; k++)
{
visit[i][k] = true;
a.push_back(arr[i][k]);
}
for (int l = i; l < N; l++)
{
for (int m = 0; m < N; m++)
{
if (!visit[l][m] && m + M - 1 < N)
{
if (!visit[l][m + M - 1])
{
for (int h = m; h <= m + M - 1; h++)
{
visit[l][h] = true;
b.push_back(arr[l][h]);
}
start();
for (int h = m; h <= m + M - 1; h++)
{
visit[l][h] = false;
b.pop_back();
}
}
}
}
}
for (int k = j; k <= j + M - 1; k++)
{
visit[i][k] = false;
a.pop_back();
}
}
}
}
}
cout << "#" << test_case << " " << result << endl;
}
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형
'Algorithm' 카테고리의 다른 글
[2020카카오공채] 가사 검색 (0) | 2020.04.10 |
---|---|
백준 5397번 키로거 (0) | 2020.04.09 |
1251. [S/W 문제해결 응용] 4일차 - 하나로 (0) | 2020.04.07 |
1222. [S/W 문제해결 기본] 6일차 - 계산기1 (0) | 2020.04.06 |
[2020카카오공채] 자물쇠와 열쇠 (0) | 2020.04.05 |