当N> = 10时,为什么此代码会冻结?

时间:2017-05-29 00:51:16

标签: c++ c++11

这是一个用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;
}

1 个答案:

答案 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的范围从1sum,其中

int sum = N*(N+1)/2;

因此,如果N < 9sum低于40;如果N>=9,则sum大于40 sum == 45 N == 9; sum == 55的{​​{1}}; N == 10的{​​{1}}。

因此,当第一个索引的最高合法值为sum = 66时,N == 11会写N == 11

灾难的精彩食谱。