#include<bits/stdc++.h>usingnamespace std;int main(){int n, k;
cin >> n >> k;
vector<int> a(n);for(int i =0; i < n; i++) cin >> a[i];bool ok =false;for(int b =0; b <1<< n; b++){int sum =0;for(int i =0; i < n; i++){if((b >> i)&1){
sum += a[i];}}if(sum == k) ok =true;}if(ok) cout <<"Yes"<< endl;else cout <<"No"<< endl;return0;}
ビット演算(おまけ)
AND、OR、XOR、NOT、左シフト、右シフトを紹介します。ビット単位の演算を行います。
AND
特定のビット以外を0にしたいときに使用します。AND演算の特性上、
a & bの結果は、bが1である部分はそのまま残り、0である部分は0になります。
AND
#include<bits/stdc++.h>usingnamespace std;int main(){int a =0b10010101, b =0b00111100;int c = a & b;/*
a | 0b10010101
b | 0b00111100
--------------
c | 0b00010100 = 0x14
*/
printf("%02X", c);return0;}
OR
特定のビットを1にしたいときに使用します。OR演算の特性上、
a | bの結果は、bが1である部分は1になり、0である部分はそのまま残ります。
OR
#include<bits/stdc++.h>usingnamespace std;int main(){int a =0b10010101, b =0b00111100;int c = a | b;/*
a | 0b10010101
b | 0b00111100
--------------
c | 0b10111101 = 0xBD
*/
printf("%02X", c);return0;}
XOR
特定のビットを反転したいときに使用します。XOR演算の特性上、
a ^ bの結果は、bが1である部分は反転し、0である部分はそのまま残ります。
XOR
#include<bits/stdc++.h>usingnamespace std;int main(){int a =0b10010101, b =0b00111100;int c = a ^ b;/*
a | 0b10010101
b | 0b00111100
--------------
c | 0b10101001 = 0xA9
*/
printf("%02X", c);return0;}
#include<bits/stdc++.h>usingnamespace std;int main(){int a =0b10010101;int b =~a;/*
a | 0b00...010010101
-------------------
b | 0b11...101101010 = 0xFFFFFF6A
*/
printf("%08X", b);return0;}