题解【洛谷 P1466 [USACO2.2]集合 Subset Sums】

sum=1+2+3+4++n=n(n+1)2

  • 如果 2sum,则显然没有方案。
  • 如果 2sum,则这两个集合的和必为 sum2

sum2 作为容量跑 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;
}
posted @   yspm  阅读(265)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示