博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USACO Section 2.2 Subset Sums
阅读量:5349 次
发布时间:2019-06-15

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

/*ID: lucien23PROG: subsetLANG: C++*/#include 
#include
using namespace std;int main(){ ifstream infile("subset.in"); ofstream outfile("subset.out"); if(!infile || !outfile) { cout << "file operation failure!" << endl; return -1; } int N; infile >> N; if (N%4 != 0 && (N+1)%4 != 0) { outfile << 0 <
<< j; if ((temp & i) == temp) { sum1 += j + 1; } else { sum0 += j + 1; } } if (sum0 == sum1) { count++; } } outfile << count/2 << endl;*/ /* * 动态规划 * 要求前n个数分成总和相等的两个子集的方案数 * 实际上就是求前n个数中的数能够组成总和为sum=n(n+1)/4的子集的数量 * 这就能够用动态规划思想,即从这个子集是否包括n能够分两种情况 * 即求前n-1个数中总和为sum-n和总和为sum的子集数目 * 设s[i, j]为从前i个数中选择数字组成总和为j的子集的数量,则有 * s[i, j] = s[i-1, j] + s[i-1, j-i] , j - i >= 0 * s[i, j] = s[i-1, j] , j - i < 0 */ int sum = N * (N + 1) / 4; long long **s = new long long*[N+1]; for (int i=0; i<=N; i++) { s[i] = new long long[sum+1](); } s[1][0] = s[1][1] = 1; for (int i=2; i<=N; i++) { for (int j=0; j<=sum; j++) { if (i > j)//不能放i { s[i][j] = s[i-1][j]; } else {//能够放i s[i][j] = s[i-1][j] + s[i-1][j-i]; } } } outfile << s[N][sum] / 2 << endl; return 0;}

转载于:https://www.cnblogs.com/gcczhongduan/p/5122324.html

你可能感兴趣的文章
php 编译常见错误
查看>>
MES架构
查看>>
【Python3 爬虫】15_Fiddler抓包分析
查看>>
高性能JavaScript-JS脚本加载与执行对性能的影响
查看>>
关于标签之间因为换行等问题造成的空白间距问题处理
查看>>
hdu 2767(tarjan)
查看>>
sklearn之分类模型混淆矩阵和分类报告
查看>>
MySQL各存储引擎
查看>>
项目--简单导出CSV文件
查看>>
Oracle session相关数据字典(一)
查看>>
织梦文章内容提取第一张或者多张图片输出
查看>>
C#用正则表达式 获取网页源代码标签的属性或值
查看>>
BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
查看>>
WCF(一) 简单的认知
查看>>
[MFC][DShow]简单例子
查看>>
降序排列
查看>>
十一、类型转换
查看>>
面试内容,值得一看
查看>>
UILabel
查看>>
【热门技术】三种SEO方式
查看>>