这道题看起来蛮简单,却花费我不少时间,看来功夫还是不够啊。深搜超时、递归也超时,DP才能过,现在对DP理解更深了一次额。

下面贴出代码,以作纪念。

View Code
 1 /*{
 2 ID:jzy3209981
 3 PROG:subset
 4 LANG:C++
 5 }*/
 6 #include<stdio.h>
 7 #include<iostream>
 8 #include<string.h>
 9 #include<math.h>
10 using namespace std;
11 
12 int dp[40][800];
13 int sum[40];
14 int main()
15 {
16     freopen ("subset.in","r",stdin);
17     freopen ("subset.out","w",stdout);
18     int n,i,j;
19     scanf("%d",&n);
20     for(i=1;i<=n;i++)
21     {
22         for(j=1;j<=i;j++)
23             sum[i]+=j;
24     }    
25     if(sum[n]%2!=0)
26         printf("0\n");
27     else
28     {
29         for(i=1;i<n;i++)
30             for(j=0;j<=sum[i];j++)
31             {
32                 if(i==1&&j==2)
33                     dp[i][j]=0;
34                 else if(j==0||j==1||j==2)
35                     dp[i][j]=1;
36                 else
37                     dp[i][j]=dp[i-1][j]+dp[i-1][j-i];
38             }        
39         printf("%d\n",dp[n-1][sum[n]/2-n]);
40     }
41     return 0;
42 }
43 
44         

 

posted on 2012-07-23 09:23  醉春雨  阅读(109)  评论(0)    收藏  举报