无优化:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=45, M=825;
int n, f[N][M], sum=0;
signed main()
{
scanf("%d", &n);
sum=n*(n+1)/2;
if (sum%2==1)
{
printf("0");
return 0;
}
f[0][0]=1;
for (int i=1; i<=n; i++)
for (int j=1; j<=sum; j++)
{
f[i][j]=f[i-1][j];
if (j>=i) f[i][j]+=f[i-1][j-i];
}
printf("%lld", f[n][sum/2]);
return 0;
}
优化后:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=45, M=825;
int n, f[M], sum=0;
signed main()
{
scanf("%d", &n);
sum=n*(n+1)/2;
if (sum%2==1)
{
printf("0");
return 0;
}
f[0]=1;
for (int i=1; i<=n; i++)
for (int j=sum; j>=i; j--)
f[j]+=f[j-i];
printf("%lld", f[sum/2]/2);
return 0;
}
01背包我优化掉第一维后,优化后为什么会计算重复答案,导致结果/2呢?就是输出答案为什么多了个 /2