这道题看起来蛮简单,却花费我不少时间,看来功夫还是不够啊。深搜超时、递归也超时,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

浙公网安备 33010602011771号