N이 3이라면 bit
변수는 000
, 001
, 010
, 011
, 100
, 101
, 110
, 111
로 표현될 수 있다.
그래서 각각 000
= 하나의 재료도 선택 안함
, 001
= 3번 재료만 선택함
이런 식으로 비트 이동만으로 모든 조합을 구할 수 있다.
1 << i
: i번째 비트만 1인 값
bit & (1 << i)
: i번째 비트가 1인지 확인
(1 << N)
: 2^N 수행
int N = 3; // 재료 개수
for (int bit = 1; bit < (1 << N); ++bit) {
cout << "조합: ";
for (int i = 0; i < N; ++i) {
if (bit & (1 << i)) {
cout << i << " "; // i번 원소가 선택됨
}
}
cout << "\n";
}
int N = 3;
for (int bit = 1; bit < (1 << N); bit++) { // 공집합 제외
System.out.print("조합: ");
for (int i = 0; i < N; i++) {
if ((bit & (1 << i)) != 0) {
System.out.print(arr[i] + " ");
}
}
System.out.println();
}
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
void input_data(vector<pair<int, int>>& flavor) {
int N, i, S, B;
cin >> N;
for (i = 0; i < N; i++) {
cin >> S >> B;
flavor.push_back({ S, B });
}
return;
}
int find_answer(vector<pair<int, int>>& flavor) {
int answer = 1000000000;
int S_sum, B_sum, N = flavor.size(), i;
//비트마스크?
for (int bit = 1; bit < (1 << N); bit++) {
S_sum = 1;
B_sum = 0;
for (i = 0; i < N; ++i) {
if (bit & (1 << i)) {
S_sum *= flavor[i].first;
B_sum += flavor[i].second;
}
}
answer = min(answer, abs(S_sum - B_sum));
}
return answer;
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<pair<int, int>> flavor;
input_data(flavor);
cout << find_answer(flavor) << "\n";
return 0;
}