原文链接:https://www.luogu.com.cn/problem/P1466
AC代码:
滚动数组:
#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
long long n,dp[1005],sum=0,num=0;
int main(){
int i,j;
memset(dp,0,sizeof(dp));
cin>>n;
dp[0]=1;
sum=n*(n+1)/2;
for(i=1;i<=n;i++){
for(j=sum;j>=0;j--){
if(j>=i){
dp[j]=dp[j]+dp[j-i];
}
else{
dp[j]=dp[j];
}
//cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
}
}
if(sum%2==0) cout<<dp[sum/2]/2<<endl;
else cout<<"0"<<endl;
return 0;
}
二维数组:
#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
long long n,dp[45][1005],sum=0,num=0;
int main(){
int i,j;
memset(dp,0,sizeof(dp));
cin>>n;
dp[0][0]=1;
sum=n*(n+1)/2;
for(i=1;i<=n;i++){
for(j=0;j<=sum;j++){
if(j>=i){
dp[i][j]=dp[i-1][j]+dp[i-1][j-i];
}
else{
dp[i][j]=dp[i-1][j];
}
//cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
}
}
if(sum%2==0) cout<<dp[n][sum/2]/2<<endl;
else cout<<"0"<<endl;
return 0;
}