JRM
For many sets of consecutive integers from 1 through N (1 <= N <= 39), one can partition the set into two sets whose sums are identical.
For example, if N=3, one can partition the set {1, 2, 3} in one way so that the sums of both subsets are identical:
- {3} and {1,2}
This counts as a single partitioning (i.e., reversing the order counts as the same partitioning and thus does not increase the count of partitions).
If N=7, there are four ways to partition the set {1, 2, 3, ... 7} so that each partition has the same sum:
- {1,6,7} and {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}
Given N, your program should print the number of ways a set containing the integers from 1 through N can be partitioned into two sets whose sums are identical. Print 0 if there are no such ways.
Your program must calculate the answer, not look it up from a table.
PROGRAM NAME: subset
INPUT FORMAT
The input file contains a single line with a single integer representing N, as above.
SAMPLE INPUT (file subset.in)
7
OUTPUT FORMAT
The output file contains a single line with a single integer that tells how many same-sum partitions can be made from the set {1, 2, ..., N}. The output file should contain 0 if there are no ways to make a same-sum partition.
SAMPLE OUTPUT (file subset.out)
4
题意:
给出 N (1 ~ 39),说明有一个集合里面的数由 1 ~ N 组成,现将这一集合平均分成均等和的两份,问有几种分发。
思路:
DP。设dp[ i ] [ j ] 为当决定第 i 种选或者不选的时候刚好装满和为 j 时的方法数,那么若第 i 件物品选的话,那就是 dp [ i - 1 ] [ j - i ],如果不选的话那就是dp[ i - 1 ] [ j ]。
故当 j >= i 时 dp[ i - 1] [ j - i ] + dp[ i - 1 ] [ j ] = dp[ i ] [ j ];
当 j < i 时,dp [ i - 1] [ j ] = dp[ i ] [ j ];
注意方法数要开 long long 即可。
AC:
/* TASK:subset LANG:C++ ID:sum-g1 */ #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main() { freopen("subset.in","r",stdin); freopen("subset.out","w",stdout); int n,sum = 0; long long dp[40][1000]; scanf("%d",&n); for(int i = 1;i <= n;i++) sum += i; if(sum % 2) printf("0\n"); else { sum /= 2; for(int i = 0;i <= n;i++) dp[i][0] = 1; //N内数构成和为0的方法就是全都不选,故只有1一种方法 for(int i = 1;i <= n;i++) for(int j = 1;j <= sum;j++) if(j >= i) dp[i][j] = dp[i - 1][j] + dp[i - 1][j - i]; else dp[i][j] = dp[i - 1][j]; printf("%lld\n",dp[n][sum] / 2); } return 0; }
相关推荐
最新版本 Subset-037_欧洲无线电系统功能接口规范,详细介绍了欧洲无线电系统功能接口规范。
subset037 V3.2.0 欧洲无线电系统功能接口规范
subset-026欧洲ETCS列车控制系统功能需求规格说明书,第二部分-基本系统描述,v3.0.0版本
subset 098 RBC-RBC安全通信协议
UNISIG Subset-037 v230 C3车地无线通信接口协议
可靠性分析中的数值模拟算法,子集模拟,可以解决高维小失效概率问题。
实践题1:Sample-Superstore-Subset-Excel.xlsx
简介:Informatica Data Subset 是一款非常灵活的企业数据增长解决方案,可将大型复杂数据库自动创建为较小的目标数据库。使用完整引用的生产数据子集,IT 组织可以大幅缩减支持非生产环境所需的时间、工作量和磁盘...
ETCS SRS SUBSET-026-1 v300
项目欧拉 我对projecteuler.net上问题的解决方案
3_Sample-Superstore-Subset-Excel.xlsx
(TreeSet) s.subSet(608, true, 611, true)
已知集合A,及集合元素间的冲突关系R,要求将集合A划分为互不相交的子集,使得同一子集中的所有元素不冲突,子集个数尽可能少。
标识了点式应答器的技术条件,属于欧洲标准
Use an approximate algorithm to find the sum of subsets. S is a set of positive integers. Find a subset of S whose sum should be as large as possible but cannot exceed t
IDL编写的按shp矢量文件对图像批量裁剪的源码
直接选择shapefile文件对影像进行裁剪
is-subset-of验证数组还是对象是子集。 状态 类别 状态 版本 依存关系 开发依赖 建造 执照 安装 $ npm install is-subset-of 快速开始 首先,您需要在应用程序中添加对is-subset-of的引用: const { isSubsetOf...
subset.nc