纯粹母函数+滚动数组,水之。
1 /* 2386 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <algorithm> 10 #include <cstdio> 11 #include <cmath> 12 #include <ctime> 13 #include <cstring> 14 #include <climits> 15 #include <cctype> 16 using namespace std; 17 18 const int maxn = 20005; 19 20 int cnt[305]; 21 int score[305]; 22 bool f[2][maxn]; 23 24 int main() { 25 int i, j, k; 26 int t, tt; 27 int n, m; 28 int ans, mx; 29 int cur, pre; 30 31 #ifndef ONLINE_JUDGE 32 freopen("data.in", "r", stdin); 33 freopen("data.out", "w", stdout); 34 #endif 35 36 scanf("%d", &tt); 37 for (t=1; t<=tt; ++t) { 38 scanf("%d %d", &n, &m); 39 memset(cnt, 0, sizeof(cnt)); 40 mx = 0; 41 for (i=0; i<n; ++i) { 42 scanf("%d", &k); 43 mx = max(k, mx); 44 ++cnt[k]; 45 ++cnt[k<<1]; 46 ++cnt[(k<<1)+k]; 47 } 48 --cnt[(mx<<1)+mx]; 49 for (n=i=0; i<305; ++i) 50 if (cnt[i]) 51 score[n++] = i; 52 memset(f, false, sizeof(f)); 53 f[0][0] = f[1][0] = true; 54 55 for (j=1, cur=1, pre=0; j<=m; ++j, pre=cur, cur=!cur) { 56 for (i=0; i<=score[n-1]*j; ++i) { 57 for (k=0; k<n; ++k) { 58 if (f[pre][i] && i+score[k]<maxn) 59 f[cur][i+score[k]] = true; 60 } 61 } 62 } 63 ans = 0; 64 for (i=0; i<=score[n-1]*m; ++i) 65 if (f[pre][i]) 66 ++ans; 67 printf("Scenario #%d: %d ", t, ans); 68 } 69 70 #ifndef ONLINE_JUDGE 71 printf("%d ", (int)clock()); 72 #endif 73 74 return 0; 75 }