RT,这两份代码我觉得在空间上没有任何不同,但是测评结果却不相同
#include<bits/stdc++.h>
#define int long long
#define max(A,B) (A<B?B:A)
#define min(A,B) (A>B?B:A)
#define qwq f[i][ab][ac]%=998244353;
using namespace std;
const int N=1e6;
int f[101][1001][1001];
int n,sum,a;
signed main(){
cin>>n;
f[0][0][0]=1;
for(int i=1;i<=n;++i)
{
cin>>a;sum+=a;
for(int ab=0;ab<=1000;++ab)
{
for(int ac=0;ac<=1000;++ac)
{
if(ab >= a&&ac >= a) f[i][ab][ac]+=f[i-1][ab-a][ac-a];qwq
if(ab>=a) f[i][ab][ac]+=f[i-1][ab-a][ac];qwq
if(ac>=a) f[i][ab][ac]+=f[i-1][ab][ac-a];qwq
f[i][ab][ac]+=f[i-1][ab][ac];qwq
}
}
}
int ans=0;
int k1,k2,k3,k4;
cin>>k1>>k2>>k3>>k4;
for(int ab=0;ab<=1000;++ab)
{
for(int ac=0;ac<=1000;++ac)
{
int cd=sum-ab,bd=sum-ac;
if(ab<=k1 && cd<=k2 && ac<=k3 && bd<=k4)
ans+=f[n][ab][ac];ans%=998244353;
}
}
cout<<ans;
}
#include<iostream>
#include<cstdio>
#define rint register int
typedef long long ll;
#define rll register ll
using namespace std;
inline ll read()
{
rll x=0;
bool fg=false;
char ch=getchar();
while(ch<'0'||ch>'9')
{
fg|=(ch=='-');
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return fg?~x+1:x;
}
const int mod=998244353;
int n;
int k1,k2,k3,k4,sum;
int w[105];
int dp[105][1005][1005];
void MOD(int &x) {
if(x>=mod) x-=mod;
}
int main()
{
n=read();
for(rint i=1;i<=n;++i)
{
w[i]=read();
sum+=w[i];
}
k1=read(),k2=read(),k3=read(),k4=read();
dp[0][0][0]=1;
for(rint i=1;i<=n;++i)
{
for(rint ab=0;ab<=1000;++ab)
{
for(rint ac=0;ac<=1000;++ac)
{
if(ab >= w[i]&&ac >= w[i]) MOD(dp[i][ab][ac]+=dp[i-1][ab-w[i]][ac-w[i]]);
if(ab>=w[i]) MOD(dp[i][ab][ac]+=dp[i-1][ab-w[i]][ac]);
if(ac>=w[i]) MOD(dp[i][ab][ac]+=dp[i-1][ab][ac-w[i]]);
MOD(dp[i][ab][ac]+=dp[i-1][ab][ac]);
}
}
}
int ans=0;
for(rint ab=0;ab<=1000;++ab)
{
for(rint ac=0;ac<=1000;++ac)
{
int cd=sum-ab,bd=sum-ac;
if(ab<=k1 && cd<=k2 && ac<=k3 && bd<=k4)
MOD(ans+=dp[n][ab][ac]);
}
}
printf("%d\n",ans);
return 0;
}
所以MLE是因为什么MLE