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

Why Does This Code Freeze When N>=10?

本文关键字:代码 冻结 gt 为什么      更新时间:2023-10-16

这是C 11中编写的程序。

text.in具有N< 10的值时,此程序正常工作。但是,当n增加到11时,它会冻结并似乎永远持续。为什么可以?

#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;
}

我很惊讶与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的CC_11;sum == 55N == 10;sum = 66用于N == 11

因此,使用N == 11,您可以编写dp[66][k],当时第一个索引的最高法律值为39

灾难的精彩食谱。