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, ...
随机推荐
- gcc 的visibility 使用
gcc 的visibility 使用(zz) -fvisibility=default|internal|hidden|protectedgcc的visibility是说,如果编译的时候用了这个属性, ...
- solr4.0.0学习(二) 数据库导入clob与blob为索引
导入clob很简单.但是blob好像没有提供方法,所以改了一下源码,重新编译替换class文件,竟然成功了. 先把配置文件贴上 SCHEMA.XML <?xml version="1. ...
- Java开发常用代码
1. 字符串有整型的相互转换 String a = String.valueOf(2); //integer to numeric string int i = Integer.parseInt(a) ...
- php-mysql结果集函数比较
本节主要介绍了获取查询结果集的4个函数,此处对它们进行综合比较. ● mysql_result():优点在于使用方便:而缺点在于功能少,一次调用只能获取结果数据集中的一行记录,对较大型的数据库 ...
- Java 8 新特性概述
Oracle 在 2014 年 3 月发布了 Java 8 正式版,该版本是一个有重大改变的版本,对 JAVA 带来了诸多新特性.其中主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作 ...
- JavaScript实现遮罩层
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- [C#] 常用工具类——应用程序属性信息访问类
using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespac ...
- boost库在工作(37)网络UDP服务端之七
前面介绍的都是网络TCP的服务器和客户端,其实还有UDP的服务器和客户端,同时也有同步和异步之分.UDP与TCP最大的区别,就是TCP是基于连接的,而UDP是无连接的.这里所谓的连接是指对方中断服务时 ...
- MYSQL 专家 ----zhaiwx_yinfeng
http://mysqllover.com/?p=708 https://yq.aliyun.com/articles/54454 http://blog.csdn.net/zhaiwx1987/ar ...
- careercup-数组和字符串1.5
1.5 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能.比如,字符串”aabcccccaaa“会变成”a2b1c5a3“.若”压缩“后的字符串没有变短,则返回原先的字符串. 类似 le ...