博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HLG 1541 集合划分【01背包】
阅读量:6957 次
发布时间:2019-06-27

本文共 749 字,大约阅读时间需要 2 分钟。

题意: 对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。举个例子,如果N=3,

         对于{1,2,3}能划分成两个子集合,每个子集合的所有数字和是相等的:{3} 和 {1,2}

         给出一个 N 值,问最多能划分成多少种等值的集合。

分析:每个数字只用到一次,每种情况的存在数可以由之前的存在的数来递推得到,01背包的变形。

#include
#include
#define clr(x)memset(x,0,sizeof(x))long long f[50000];int main(){ long long n,i,j,v; while(scanf("%lld",&n)!=EOF) { if(n==0) break; v=n*(n+1)/2; if(v%2==1) { printf("0\n"); continue; } clr(f); f[0]=1; v/=2; for(i=1;i<=n;i++) for(j=v;j>=i;j--) f[j]+=f[j-i]; printf("%lld\n",f[v]/2); } return 0;}

 

转载于:https://www.cnblogs.com/dream-wind/archive/2012/08/20/2648109.html

你可能感兴趣的文章
《CSS权威指南》基础复习+查漏补缺
查看>>
【.NET版月经问题】之二【引用类型参数就是按引用传递吗?】
查看>>
数据结构基础(20) --图的存储结构
查看>>
Metasploit相关视频
查看>>
Failed deleting my ephemeral node
查看>>
Oracle Database字符集(2)--基本概念
查看>>
fdupes 删除指定目录下重复文件
查看>>
网络嗅探软件全接触(1)
查看>>
针对binlog MIXED格式对表的增删改统计分析
查看>>
.NET简谈观察者模式
查看>>
Exchange2007中创建收件人对象、通讯组和地址列表和客户端访问
查看>>
Spring MVC Controller单例陷阱
查看>>
Azure运维系列 4:安装和使用Azure PowerShell管理云
查看>>
Java:初始化类、变量、程序块加载探讨
查看>>
在VMWare中配置SQLServer2005日志传送 Step by Step(一)——前言&预安装
查看>>
Symfony2CookBook:如何进行表单的定制渲染
查看>>
MySQL和DB2建表SQL差异
查看>>
你所不了解的静态路由特点及配置
查看>>
SQL条件查询及数据类型cast转换
查看>>
多套方案来提高python web框架的并发处理能力
查看>>