USACO 2.2 Subset Sums(水DP)

纠结了几次INT64和longlong,CE了几次。。。

 1 /*
 2 ID: cuizhe
 3 LANG: C++
 4 TASK: subset
 5 */
 6 #include <cstdio>
 7 #include <cstring>
 8 #include <cmath>
 9 #include <algorithm>
10 using namespace std;
11 long long dp[50][1001];
12 int main()
13 {
14     int i,j,n,sum;
15     freopen("subset.in","r",stdin);
16     freopen("subset.out","w",stdout);
17     scanf("%d",&n);
18     for(i = 1;i <= n;i ++)
19     dp[i][0] = 1;
20     sum = (1+n)*n/2;
21     if(sum%2)
22     {
23         printf("0\n");
24         return 0;
25     }
26     sum = sum/2;
27     dp[1][1] = 1;
28     for(i = 2;i <= n;i ++)
29     {
30         for(j = 1;j <= sum;j ++)
31         dp[i][j] = dp[i-1][j];
32         for(j = i;j <= sum;j ++)
33         {
34             dp[i][j] += dp[i-1][j-i];
35         }
36     }
37     printf("%lld\n",dp[n][sum]/2);
38     return 0;
39 }
posted @ 2012-11-08 10:44  Naix_x  阅读(142)  评论(0编辑  收藏  举报