1. 程式人生 > >計蒜客: 等和的分隔子集 (01揹包)

計蒜客: 等和的分隔子集 (01揹包)

https://nanti.jisuanke.com/t/28

曉萌希望將1到N的連續整陣列成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於N=3,對應的集合{1,2,3}能被劃分成{3} 和 {1,2}兩個子集合.

這兩個子集合中元素分別的和是相等的。

對於N=3,我們只有一種劃分方法,而對於N=7時,我們將有4種劃分的方案。

輸入包括一行,僅一個整數,表示N的值(1≤N≤39)。

輸出包括一行,僅一個整數,曉萌可以劃分對應N的集合的方案的個數。當沒發劃分時,輸出0。

樣例輸入

7

樣例輸出

4

dp[i][j]表示i個數加成j有幾種可能,

dp[i][j]=dp[i-1][j]+dp[i-1][j-i];

#include<stdio.h>
long long dp[2000];
int main()
{
	int n,s,i,j,ans;
	scanf("%d",&n);
	s=n*(1+n)/2;
	if(s%2)
		printf("0\n");
	else
	{
		dp[0]=1;
		for(i=1;i<=n;i++)
			for(j=s/2;j>=i;j--)
				dp[j]=dp[j]+dp[j-i];
		printf("%lld\n",dp[s/2]/2);
	}
	return 0; 
}