题解:AT_abc169_f [ABC169F] Knapsack for All Subsets
N1tr0us_Acid · · 题解
集训选了这题,遂写题解。
\texttt{Solution}
不难发现,如果有一个集合
考虑 DP,我们令
因为
初始化
\texttt{Code}
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
int n, s;
const int N = 3005;
int a[N];
int f[N][N];
const int mod = 998244353;
signed main(void) {
ios :: sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> s;
f[0][0] = 1;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= n; i ++) {
for (int j = 0; j <= s; j ++) {
f[i][j] = f[i - 1][j] * 2;
f[i][j] %= mod;
if(j >= a[i]) f[i][j] = (f[i][j] + f[i - 1][j - a[i]]) % mod;
}
}
cout << f[n][s] << endl;
return 0;
}