본문 바로가기
이것저것

백준 14697 방배정하기

by 문자메일 2018. 5. 5.

#include <cstdio>


using namespace std;


int main()

{

int A, B, C, N;

int i = 1, j = 1, k = 1; // N의 값보다 작은 A, B, C의 배수를 arr배열에 저장하기 위함. 

bool existA = false, existB = false, existC = false; //arr 배열에 N보다 작은 A, B, C 배수를 저장을 완료하면 탈출하기 위함

int arrA[301] = { 0, }, arrB[301] = { 0, }, arrC[301] = { 0, };

scanf("%d %d %d %d", &A, &B, &C, &N);

// 각 arr배열에 N보다 작은 A, B, C의 배수 저장

while(true){

if (arrA[i - 1] + A <= N){

arrA[i] = arrA[i - 1] + A;

i++; 

}

else

existA = true;

if (arrB[j - 1] + B <= N){

arrB[j] = arrB[j - 1] + B;

j++;

}

else

existB = true;


if (arrC[k - 1] + C <= N){

arrC[k] = arrC[k - 1] + C;

k++; 

}

else

existC = true;

if (existA == true && existB == true && existC == true)

break;

}

/*

i, j, k 3중 반복문으로 계산. 도중에 합계가 초과되면 백트래킹으로 가지치기를 한다.

*/


bool checkExistAns = false;

for (int ii = 0; ii < i; ii++){

int sum = 0;

sum += arrA[ii];

for (int jj = 0; jj < j; jj++){

sum += arrB[jj];

for (int kk = 0; kk < k; kk++){

sum += arrC[kk];

if (sum == N){

//종료

checkExistAns = true;

break;

}

else if (sum > N){

sum -= arrC[kk];

break;

}

sum -= arrC[kk];

}

//답이 존재하면 탈출

if (checkExistAns == true) break;

sum -= arrB[jj];

}

//답이 존재하면 탈출

if (checkExistAns == true) break;

}


//정답이 있을 경우와 없을 경우 답 출력

if (checkExistAns == true){

printf("1\n");

}

else{

printf("0\n");

}


return 0;

}

'이것저것' 카테고리의 다른 글

백준 14501 퇴사  (0) 2018.05.08
백준 2294 동전2 소스  (0) 2018.05.06
백준 14696 딱지놀이  (0) 2018.05.05
SW 2117 홈 방범 서비스  (0) 2018.04.14
백준 2468 안전 영역  (0) 2018.04.14

댓글