[2016/7/23][usaco 2.2]Subset Sums
2016-07-23 09:17
239 查看
http://train.usaco.org/usacoprob2?a=iLSvc4aatpo&S=subset
题目大意:给你一个数N(<=39),一个集合Q里的元素是1~N,把这个集合分成两个,使两个子集的元素和相等。有多少种分割方案。
就是0-1背包问题。设Q的元素和为sum,则两个子集的元素和是sum/2,即背包容量。从N个数里面挑若干,使背包充满,求方案数。
然后可以得知总共方案数是dp[sum]/2.
如果sum是奇数,直接不能分割,输出0.
接下来找状态转移方程。
状态设为dp[i],意为从前i个数里挑若干个使其满足和是j的方案数。
这道题有个奇坑!!
long long数组,一定要初始化!还要用多少就初始化多少!!不然会出现奇怪的错误,都是玄学
http://www.nocow.cn/index.php/USACO/subset
讲得挺清楚,直接上代码
题目大意:给你一个数N(<=39),一个集合Q里的元素是1~N,把这个集合分成两个,使两个子集的元素和相等。有多少种分割方案。
就是0-1背包问题。设Q的元素和为sum,则两个子集的元素和是sum/2,即背包容量。从N个数里面挑若干,使背包充满,求方案数。
然后可以得知总共方案数是dp[sum]/2.
如果sum是奇数,直接不能分割,输出0.
接下来找状态转移方程。
状态设为dp[i],意为从前i个数里挑若干个使其满足和是j的方案数。
这道题有个奇坑!!
long long数组,一定要初始化!还要用多少就初始化多少!!不然会出现奇怪的错误,都是玄学
http://www.nocow.cn/index.php/USACO/subset
讲得挺清楚,直接上代码
/* ID:49743541 LANG:C++ TASK:subset */ #include <stdio.h> #include <algorithm> #include <iostream> using namespace std; long long dp[43]; int main(){ freopen("subset.in", "r", stdin); freopen("subset.out", "w", stdout); int N; cin>>N; int sum = N*(N+1)/2; if(sum%2) { printf("0\n"); return 0; } sum/=2; for(int i = 1;i<sum;i++) dp[i] = 0; dp[0] = 1; for(int i = 1;i<=N;++i){ for(int j = sum;j>=i;--j){ dp[j] += dp[j-i]; } } cout<<(dp[sum]/2)<<endl; return 0; }
相关文章推荐
- cin循环输入控制问题
- 建设一套直播CDN、直播平台到底有多难?
- 贪心算法
- 删除右键"上传到有道云笔记"
- 杭电ACM 2031,2057 进制转化问题
- 手游直播到底难在哪里?
- Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exc
- [李景山php]每天laravel-20160925|Pipeline.php
- 如何架构大规模云端直播录制集群?
- golang image图片处理示例
- 人见人爱A-B hd 2034
- hdoj4883TIANKENG’s restaurant
- 萌妹网红陪看球,欧洲杯直播技术探秘
- 数据报的分片与组装
- centos 没有可用的网络设备
- 网络直播内容审核:拒绝黄拒绝赌拒绝黄赌毒!
- string十大热点
- awk 系列:如何使用 awk 复合表达式
- awk 系列:如何使用 awk 复合表达式
- String类比较,String类运算比较,String运算