USACO 2.2 Subset Sums 集合(subset)
Description
对于从1到N的连续整集合,能划分成两个子集合,且保证每个集合的数字和是相等的。
举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:
- {3} and {1,2}
这是唯一一种分法(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)
如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:
- {1,6,7} and {2,3,4,5} {注 1+6+7=2+3+4+5}
- {2,5,7} and {1,3,4,6}
- {3,4,7} and {1,2,5,6}
- {1,2,4,7} and {3,5,6}
给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。程序不能预存结果直接输出。
好 废话不多说这是我在Ubuntu下打的第一个代码,个人认为Ubuntu下很多界面较好 风格也还行(又说废话了)。。。
这道题是一个dp 大致的意思是从1-n的每个数都给你一个 然后叫你找有多少种可能a+b+c...==x+y+z(当然a,b,c,x,y,都属于这n个数)同时 这些数都要用完而且不能重复用
刚刚看题目颇为不解 这用dp该怎么做 明显是坑爹嘛 后来实在想不出来就去baidu了(。。。) 然后看到一种普遍的解法就是看作一个01背包然后“
如果M=n*(n+1)/2是奇数,则没有分法。如果是偶数,背包容量为M/2,dp[k] += dp[k-i],(i=1,2,...,n)计算k的时候为避免重算,
需倒着进行。”(这不还是看不懂嘛(请原谅我的愚笨))
再后来一想[1,n]这个区间里所有数不久形成了一个an=n的等差数列嘛 那么根据求和公式sn=n+n*(n-1)/2 =n*(n+1)/2 既然这样 要使两边相等 那么
l(左边的和)=r(右边的和)=n*(n+1)/4 这样的话如果算出来的n*(n+1)/4为小数的话那么肯定就不可能有解了嘛 所以只要在开始判断一下n*(n+1)/4能不能除尽(即判断n*(n+1)%4是否为0) 然后如果除不尽就直接return 掉就行了。
在初步的判断完以后 我们就要开始用dp大法了 可以看作有n个物品 给你n*(n+1)/4的质量 这一次的分法就等于这一次j比i多出来的数的分法加上原来i的分法
代码如下:
#include<iostream>
using namespace std;
const int maxn=+;
long long f[];
int n,s;
int main()
{
cin>>n;
s=n*(n+);
if(s%!=)
{
cout<<<<endl;
return ;
}
s/=;
f[]=;
for(int i=;i<=n;i++)
for(int j=s;j>=i;j--)
f[j]+=f[j-i];
cout<<f[s]/<<endl;
return ;
}
USACO 2.2 Subset Sums 集合(subset)的更多相关文章
- 洛谷P1466 集合 Subset Sums
P1466 集合 Subset Sums 162通过 308提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 对于从1到N (1 ...
- 【USACO 2.2】Subset Sums (DP)
N (1 <= N <= 39),问有多少种把1到N划分为两个集合的方法使得两个集合的和相等. 如果总和为奇数,那么就是0种划分方案.否则用dp做. dp[i][j]表示前 i 个数划分到 ...
- DP | Luogu P1466 集合 Subset Sums
题面:P1466 集合 Subset Sums 题解: dpsum=N*(N+1)/2;模型转化为求选若干个数,填满sum/2的空间的方案数,就是背包啦显然如果sum%2!=0是没有答案的,就特判掉F ...
- Project Euler 106:Special subset sums: meta-testing 特殊的子集和:元检验
Special subset sums: meta-testing Let S(A) represent the sum of elements in set A of size n. We shal ...
- Project Euler P105:Special subset sums: testing 特殊的子集和 检验
Special subset sums: testing Let S(A) represent the sum of elements in set A of size n. We shall cal ...
- Project Euler 103:Special subset sums: optimum 特殊的子集和:最优解
Special subset sums: optimum Let S(A) represent the sum of elements in set A of size n. We shall cal ...
- Codeforces348C - Subset Sums
Portal Description 给出长度为\(n(n\leq10^5)\)的序列\(\{a_n\}\)以及\(m(m\leq10^5)\)个下标集合\(\{S_m\}(\sum|S_i|\leq ...
- CodeForces 348C Subset Sums(分块)(nsqrtn)
C. Subset Sums time limit per test 3 seconds memory limit per test 256 megabytes input standard inpu ...
- spoj-SUBSUMS - Subset Sums
SUBSUMS - Subset Sums Given a sequence of N (1 ≤ N ≤ 34) numbers S1, ..., SN (-20,000,000 ≤ Si ≤ 20, ...
随机推荐
- LR(1)表驱动语法分析程序
/* * LR(1) 语法分析 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #inc ...
- mysql常用的一些命令,用于查看数据库、表、字段编码
1.查看数据库支持的所有字符集 show character set;或show char set; 2.查看当前状态 里面包括当然的字符集设置 status或者\s ...
- 圣诞节来了,雪花纷飞的CSS3动画,还不首页用起来
圣诞节来了,冬天来了,怎么可以没有雪花纷飞效果,昨天下班前折腾了一会儿,弄了个雪花纷飞的实例,有兴趣的可以交流分享下. 原文链接:http://www.html5think.com/article/i ...
- Android Socket编程基础
前些天写了一个Android手机在局域网内利用Wifi进行文件传输的Demo,其中用到了Socket编程,故此总结(盗了网友的一些图和文字).好久好久没来博客园了~~ 1.什么是Socket? soc ...
- Makefile 入门与基本语法 分类: C/C++ ubuntu 2015-05-18 11:16 466人阅读 评论(0) 收藏
在我看来,学会写简单的Makefile,阅读较复杂的makefile,是每一个Linux程序员都必须拥有的基本素质.Makefile可以自动识别哪些源文件被更改过,需要重新编译,那些不需要.从而节省大 ...
- java web应用下跨域3招
一.设置服务器端,让ajax能直接调用 服务器端设置 tomcat 设置为例: 在web.xml中添加如下过滤器 <filter> <filter-name>CorsFilte ...
- oracle9
约束 维护数据的完整性 数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则(比如年纪不能为-,性别不能为非男女),在oracle中,数据完整性可以使用约束.触发器.应用程序(过程.函数)三种方法来 ...
- 介绍 JSON
出自官网:http://www.json.org/json-zh.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于 ...
- oracle用户管理入门
1.创建一个新用户(普通) create user 用户名 identified by 密码 示例,创建一个名叫小明的用户,密码为xm 2.以管理员的身份给普通用户修改密码(当普通用户忘掉自己的密码时 ...
- use_virtual_func_without_pointer_left
#include <oistream> using namespace std; class A { public: void foo() { func(); } virtual void ...