题解【洛谷 P1466 [USACO2.2]集合 Subset Sums】
设 \(sum=1+2+3+4+\dots+n=\dfrac{n(n+1)}{2}\)。
- 如果 \(2\nmid sum\),则显然没有方案。
- 如果 \(2\mid sum\),则这两个集合的和必为 \(\dfrac{sum}{2}\)。
将 \(\dfrac{sum}{2}\) 作为容量跑 0-1 背包即可。
Code:
#include<iostream>
using namespace std;
const int N=45,SUM=785;
typedef long long ll; //必须开 long long/dk
ll dp[SUM],n,sum;
int main()
{
cin>>n;
sum=(1+n)*n/2; //计算 sum
if (sum&1){cout<<0;return 0;} //特判
sum/=2; dp[0]=1; //初始化
for (int i=1;i<=n;i++)
for (int j=sum;j>=0;j--)
if (j>=i) dp[j]+=dp[j-i]; //i 为重量,价值为 0,算方案数要将 max 换成 sum。
cout<<dp[sum]/2; //输出要 /2
return 0;
}
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/12884338.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ