【题意分析】
显然是一个可行性dp,dp[i]
就表示当前状态可不可达
对于输入,给你的 a i a_i ai一次一次往上筛就好了,复杂度正确
Code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#define MAXN 200000
#define int long long
using namespace std;
bool dp[MAXN];
int a[MAXN];
inline int read () {
register int s = 0, w = 1;
register char ch = getchar ();
while (! isdigit (ch)) {if (ch == '-') w = -1; ch = getchar ();}
while (isdigit (ch)) {s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar ();}
return s * w;
}
signed main () {
int T = read ();
for (register int I = 1; I <= T; I++) {
int n = read (), ans = 0, lim;
memset (dp, 0, sizeof dp);
for (register int i = 1; i <= n; i++) a[i] = read (), lim = max (lim, a[i]);
sort (a + 1, a + n + 1);
for (register int i = 1; i <= n; i++) {
if (dp[a[i]]) continue; dp[a[i]] = 1, ans++;
for (register int j = a[i] + 1; j <= lim; j++)
dp[j] |= dp[j - a[i]];
}
printf ("%lld\n", ans);
}
return 0;
}