p1271 集合求和

版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84538550

题目

https://www.luogu.org/problem/show?pid=1466

题解

1.,若以sum为1…N的和,本题可化为求背包容积为sum/2,n个物品的01背包问题 ,这是很关键的,然而我却没想到
2.需要注意的是:要判断一下sum是否为偶数,因为累和是奇数不能分为相等的两堆!!!!!
3.最后,相信应该都会01背包的模板。。。。。。。毕竟,死记硬背都能背下来,比如我这个caibi

代码

#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
	long long f=1,num=0;
	char ch=getchar();
	while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
	while (ch>='0'&&ch<='9') num=(num<<1)+(num<<3)+ch-'0', ch=getchar();
	return num*f;
}
long long f[10000];
int main()
{
	long long n=read();
	long long sum=(n*(n+1))/2;
	if (sum%2)//累和是奇数不能分为相等的两堆
	{
		printf("0\n");
		exit(0);
	}
	else sum/=2;//原题可化成求背包容积为sum/2,n个物品的01背包问题 
	f[0]=1;
	for (int i=1;i<=n;++i)
		for (int j=sum;j>=i;--j)
			f[j]+=f[j-i];
	printf("%lld\n",f[sum]/2);
	return 0;
}

小结

总之,刚开始学习DP,要耐心。。。。。。。。。。

静待一树花开,待你叶落归来。——安意如《人生若只如初见》

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84538550