版权声明: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,要耐心。。。。。。。。。。
静待一树花开,待你叶落归来。——安意如《人生若只如初见》