コードの全貌
bitsearch.cpp
int main() {
//ios::sync_with_stdio(false);
//cin.tie(0);
int n,w;
cin >> n >> w;
vector<int> v(n);
for(int i = 0; i < n; i++) {
cin >> v[i];
}
bool exist = false;
for(int bit = 0; bit < (1 << n); bit++) {
int sum = 0;
for(int i = 0; i < n; i++) {
if(bit & (1 << i)) {
sum += v[i];
}
}
if(sum == w) {exist = true;}
}
if(exist) cout << "Yes" << endl;
else cout << "No" << endl;
}
これまでわかっていなかったことと、今した理解
didnt_understand_part.cpp
for(int bit = 0; bit < (1 << n); bit++)
こう書くときに「bitを使っているんだな」と表層のことしか理解していなかったが、
奥の方.cpp
if(bit & (1 << i)) {
sum += v[i];
}
このパートでbitの0と1だけの性質が一役買っていることに気付いた。
多分、
「00000001」→「00000010」→「00000011」...
のように進み、1の立っているところのインデックスだけベクターから数値を足して考えているのだと捉えられた。