Subset Sums
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
思路:
题目是问,一个连续整数集合,如{ 1, 2, 3, 4, 5 },总共可以分解成多少对和一样的子集。
先排除一种情况:如果这个数列之和为奇数,那么不可以形成平分集,直接输出0。
转化一下问题,把数列和除以二,得到目标值,即寻找在数列范围内的、和等于目标值的集合数,再除以二即得到答案。
如何寻找这样的集合个数?我采用一个数组来记录,每次增加一个新元素,然后更新对应的区域
一个小技巧:为了防止发生重复,应该逆序,详见代码
USER: Geterns Liu [geterns1] TASK: subset LANG: C++ Compiling... Compile: OK Executing... Test 1: TEST OK [0.000 secs, 3012 KB] Test 2: TEST OK [0.011 secs, 3012 KB] Test 3: TEST OK [0.000 secs, 3012 KB] Test 4: TEST OK [0.022 secs, 3012 KB] Test 5: TEST OK [0.000 secs, 3012 KB] Test 6: TEST OK [0.011 secs, 3012 KB] Test 7: TEST OK [0.011 secs, 3012 KB] All tests OK.Your program ('subset') produced all correct answers! This is your submission #4 for this problem. Congratulations!
Here are the test data inputs:
------- test 1 ------- 7 ------- test 2 ------- 15 ------- test 3 ------- 24 ------- test 4 ------- 31 ------- test 5 ------- 36 ------- test 6 ------- 39 ------- test 7 ------- 37Keep up the good work!
Thanks for your submission!