这是一个用C ++ 11编写的程序。
当text.in的值#include <cstdio>
using namespace std;
int dp[40][391]={0};
int main() {
FILE* in = fopen("text.in","r");
FILE* out = fopen("text.out","w");
int N;
fscanf(in,"%d",&N);
int sum = N*(N+1)/2;
for (int i=0; i<=N; i++) dp[0][i]=1;
if (sum%2==1) {fprintf(out,"0"); return 0;}
for (int n=1; n<=sum; n++) {
for (int k=1; k<=N; k++) {
if (n-k>=0) dp[n][k]=dp[n-k][k-1];
dp[n][k]+=dp[n][k-1];
}
}
fprintf(out,"%d",dp[sum/2][N]/2);
return 0;
}
答案 0 :(得分:1)
我很惊讶与N == 9
合作。
您定义
int dp[40][391]
你在里面读/写
if (n-k>=0) dp[n][k]=dp[n-k][k-1];
dp[n][k]+=dp[n][k-1];
第一个索引n
的范围从1
到sum
,其中
int sum = N*(N+1)/2;
因此,如果N < 9
,sum
低于40
;如果N>=9
,则sum
大于40
sum == 45
N == 9
; sum == 55
的{{1}}; N == 10
的{{1}}。
因此,当第一个索引的最高合法值为sum = 66
时,N == 11
会写N == 11
。
灾难的精彩食谱。