백준 2502 c++ : DP

magicdrill·2024년 12월 10일

백준 문제풀이

목록 보기
504/673

백준 2502 c++ : DP

오히려 처음 생각한 방정식 풀이 방식이 맞았다...
그런데 루프 한개로 A만 바꿔서 B를 구하는걸 이해를 못하겠다...

#include <iostream>
#include <vector>

using namespace std;

void find_answer(int D, int K) {
	//어제 받은 떡 + 그저께 받은 떡 받아야 무사히 보내줌
	//D : 넘어온 날
	//K : 그날 호랑이에게 준 떡의 개수

	/*
	vector<int> DP(D + 1, 0);
	int i, j, k;

	for (i = 1; i < D; i++) {
		DP[1] = i;
		for (j = 1; j <= K; j++) {
			DP[2] = j;
			//cout << "A : " << DP[1] << " | B : " << DP[2] << " : ";
			for (k = 3; k <= D; k++) {
				DP[k] = DP[k - 2] + DP[k - 1];
				if (DP[k] > K) {
					break;
				}
				//cout << DP[k] << " ";
			}
			//cout << "\n";
			if (DP[D] == K) {
				cout << DP[1] << "\n" << DP[2] << "\n";
				return;
			}
		}
	}
	*/

	vector<int> A(D + 1, 0);
	vector<int> B(D + 1, 0);
	int i, current;

	A[1] = 1;
	A[2] = 0;
	B[1] = 0;
	B[2] = 1;
	for (i = 3; i <= D; i++) {
		A[i] = A[i - 2] + A[i - 1];
		B[i] = B[i - 2] + B[i - 1];
	}
	//cout << "A * " << A[D] << " + " << "B * " << B[D] << " = " << K << "\n";
	//이중 for문을 돌릴수도 있지만.
	//X*A + Y*B = K니까 K - A[i]*A = B[i]*B고, B[i]값은 알고 있으니까
	for (i = 1; i <= K; i++) {
		current = K - (A[D] * i);
		cout << A[D] << " * " << i << " + " << B[D] << " * " << current / B[D] << " = " << A[D] * i + current << "\n";
		if (current % B[D] == 0) {
			cout << i << "\n" << current / B[D] << "\n";
			break;
		}
	}


	return;
}

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

	int D, K;

	cin >> D >> K;
	find_answer(D, K);

	return 0;
}

0개의 댓글