P1466 集合 Subset Sums

  • 162通过
  • 308提交
  • 题目提供者该用户不存在
  • 标签USACO
  • 难度普及/提高-

提交  讨论  题解

最新讨论

  • 暂时没有讨论

题目描述

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

{3} 和 {1,2}

这是唯一一种分法(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数) 如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分法的子集合各数字和是相等的:

{1,6,7} 和 {2,3,4,5} {注 1+6+7=2+3+4+5}

{2,5,7} 和 {1,3,4,6}

{3,4,7} 和 {1,2,5,6}

{1,2,4,7} 和 {3,5,6}

给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。程序不能预存结果直接输出(不能打表)。

输入输出格式

输入格式:

输入文件只有一行,且只有一个整数N

输出格式:

输出划分方案总数,如果不存在则输出0。

输入输出样例

输入样例#1

7

输出样例#1

4

说明

翻译来自NOCOW

USACO 2.2

分析:这道题数据小,很容易过,每个数要么在第一个集合,要么在第二个集合,那么暴搜可以解决,在这里讲一个比较高级一点的做法,其实我们可以把两个集合看作取不取这个数,那么这道题就变成了0-1背包问题,设f[i][j]为前i个数中让和为j的方案个数,可以发现方案数=不取i的方案数+取i的方案数,前提是能够取i,即j > i,注意:如果选了一个数,那么方案数是不变的,所以状态转移方程为f[i][j] = f[i-1][j] + f[i-1][j - i] (j > i).然后发现方案数如果位置不同那么还是算同一个方案,那么问题就是求用n个数凑num/2的方案数(num是和),当然,如果num为奇数则无解.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n,num,f[][]; int main()
{
scanf("%d", &n);
num = n * (n + ) / ;
if (num % )
printf("0\n");
else
{
f[][] = ;
f[][] = ;
for (int i = ; i <= n; i++)
for (int j = ; j <= num; j++)
if (j > i)
f[i][j] = f[i - ][j] + f[i - ][j - i];
else
f[i][j] = f[i - ][j];
printf("%d\n", f[n][num / ]);
} return ;
}

洛谷P1466 集合 Subset Sums的更多相关文章

  1. 洛谷 P1466 集合 Subset Sums Label:DP

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

  2. 洛谷P1466 集合 Subset Sums_01背包水题

    不多解释,适当刷刷水… Code: #include<cstdio> #include<algorithm> using namespace std; const int ma ...

  3. DP | Luogu P1466 集合 Subset Sums

    题面:P1466 集合 Subset Sums 题解: dpsum=N*(N+1)/2;模型转化为求选若干个数,填满sum/2的空间的方案数,就是背包啦显然如果sum%2!=0是没有答案的,就特判掉F ...

  4. P1466 集合 Subset Sums(01背包求填充方案数)

    题目链接:https://www.luogu.org/problem/show?pid=1466 题目大意:对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合, ...

  5. 洛谷P1466集合——背包

    题目:https://www.luogu.org/problemnew/show/P1466 水题,注意开long long; 代码如下: #include<iostream> #incl ...

  6. [LUOGU] P1466 集合 Subset Sums

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

  7. P1466 集合 Subset Sums 搜索+递推+背包三种做法

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

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

    题目传送门 设 \(sum=1+2+3+4+\dots+n=\dfrac{n(n+1)}{2}\). 如果 \(2\nmid sum\),则显然没有方案. 如果 \(2\mid sum\),则这两个集 ...

  9. 洛谷P1491 集合位置 [最短路,SPFA]

    题目传送门 题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记 ...

随机推荐

  1. 黄聪:C#如何通过MeasureString、Graphics获取字符串的像素长度

    1.    使用g.MeasureString()获得 使用MeasureString测量出来的字符宽度,总是比实际宽度大一些,而且随着字符的长度增大,貌似实际宽度和测量宽度的差距也越来越大了.查了一 ...

  2. TCP程序设计

        在Java中使用Socket(套接字)完成TCP程序的开发,使用此类可以方便地建立可靠的.双向的.持续的.点对点的通信连接.     在Socket的程序开发中,服务器端使用ServerSoc ...

  3. 单实例Singleton

    单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在 整个系统中只能出现一个类的实例.这样做当然是有必然的, ...

  4. ARM NEON编程系列1-导论

    ARM NEON 编程系列1 - 导论 前言 本系列博文用于介绍ARM CPU下NEON指令优化. 博文github地址:github 相关代码github地址:github NEON历史 ARM处理 ...

  5. Hbase的安装(hadoop-2.6.0,hbase1.0)

    Hbase的安装相对很简单啊...只要你装了Hadoop 装Hbase就是分分钟的事 如果要装hadoop集群的话 hadoop分类的集群安装好了,如果已经装好单机版~ 那就再配置如下就好~ 一.vi ...

  6. PLSQL_性能优化工具系列17_Best Practices: Proactive Data Collection for Performance Issues

    占位符 https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=2082062510193540&id=1366133. ...

  7. Shell Python 日期和时间戳的互相转换

    一.初衷: 很多时候,时间的存储都是时间戳格式,如果需要展示就要转化成标准格式日期.也许会需要date和timestamp互转. 二.方法: 1.Shell下对date和timestamp的互转,是通 ...

  8. NPOI格式设置

    using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; //创建Execl IWorkbook hssfworkbook =new HSSFWorkbo ...

  9. JAVA 理解封装的概念,private私有的,public公有的

    封装就是把不想或者不该告诉别人的东西隐藏起来,把可以告诉别人的公开. 做法:修改属性的访问权限来限制对属性的访问,并为每一个属性创建一对取值和赋值的方法,用于对这些属性的访问 通过封装,可以在给属性赋 ...

  10. Windows 32 程序设计

    C语言版 开发语言:C语言 开发工具:Visual Studio 2015 目      标:使用C语言,直接调用Windows API,创建Windows程序. 参考图书:<Windows程序 ...