排个序,从小到大扫,如果当前这个不能被前面那些小的表示,则加入货币系统。与bzoj某权限的一道POI题有点像,只是那题只能用一次。
1 int T, n, a[105]; 2 3 int main() { 4 for (read(T); T; T--) { 5 read(n); 6 int mx = 0, ans = 0; 7 rep(i, 1, n) read(a[i]), mx = max(mx, a[i]); 8 sort(a + 1, a + 1 + n); 9 bitset<25005> bt; 10 bt.reset(); bt.set(0); 11 rep(i, 1, n) { 12 if (!bt.test(a[i])) { 13 ans++; 14 for (int j = 1; j * a[i] <= mx; j++) 15 bt |= bt << a[i]; 16 } 17 } 18 writeln(ans); 19 } 20 return 0; 21 }