// kmjpさんの解説を読んだ #include #include #include using namespace std; int main(){ int n, m; cin >> n; int a[n]; for(int i = 0; i < n; i++) cin >> a[i]; cin >> m; int b[m]; for(int i = 0; i < m; i++) cin >> b[i]; sort(b, b+m); reverse(b, b+m); int sum[1<>j)&1) sum[i] += a[j]; } } // dp[i][j] := 大きい方からi個の箱を用いてビット列j // が表すおもちゃ集合を格納出来るか否か bool dp[m+1][1<= 1)][y]を更新していく // O(m * 2^n * 2^n) for(int i = 0; i < m; i++){ for(int s1 = 0; s1 < 1< b[i] || (s1&s2)) continue; dp[i+1][s1|s2] = true; } } if(dp[i+1][(1<