Algorithm

전체 탐색에서 부분합 문제를 비트를 사용하는 방법

HYuk 2023. 4. 9. 22:57
728x90

부분합 문제

 

예를들어,

vec{1,2,4,5,11} 이라는 숫자의 부분합으로 10이 나올 수 있는지 파악하는 방법으로 비트연산으로 하는 방법이 있어서 블로그에 기록해본다

 

비트연산을 활용하여 하는 방법이 있는데,

위의 벡터의 부분합의 가지수는 총 32가지 즉, 비트로 11111 (2^5) 로 나타낼 수 있다.

예를 들면 1, 4, 5를 선택 하면 10이 나오는데, 이는 비트로 01101(오른쪽부터 vec[0]이라고 치면) 로 나타낼 수 있다.

 

코드로 치면 다음과 같다

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	bool isCanmake = false;

	vector<int> vec = { 1,2,4,5,11 };

	int answer = 10;

	for (int i = 0; i < (1 << vec.size()); ++i) // 32가지 for문을 돌리는 구간
	{
		int sum = 0;

		for (int j = 0; j < vec.size(); ++j) // 5개 숫자를 찾는 구간
		{
			if (i & 1 << j)
			{
				sum += vec[j];
			}
		}
		if (sum == answer)
		{
			isCanmake = true;
			break;
		}
	}

	if (isCanmake)
	{
		cout << "True";
	}
	else
	{
		cout << "False";
	}

	return 0;
}
728x90