1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| 拥有唯一出现的元素和的子集
对于任意数集A,记A中所有元素的和为sum(A)。 考虑集合B = {1,3,6,8,10,11}。 B有20个子集包含恰好三个元素,而这些子集的元素和分别是:
sum({1,3,6}) = 10, sum({1,3,8}) = 12, sum({1,3,10}) = 14, sum({1,3,11}) = 15, sum({1,6,8}) = 15, sum({1,6,10}) = 17, sum({1,6,11}) = 18, sum({1,8,10}) = 19, sum({1,8,11}) = 20, sum({1,10,11}) = 22, sum({3,6,8}) = 17, sum({3,6,10}) = 19, sum({3,6,11}) = 20, sum({3,8,10}) = 21, sum({3,8,11}) = 22, sum({3,10,11}) = 24, sum({6,8,10}) = 24, sum({6,8,11}) = 25, sum({6,10,11}) = 27, sum({8,10,11}) = 29.
这其中的有些元素和出现了不止一次,其它元素和则是唯一出现的。 对于任意集合A,先求A所有恰好包含k个元素的子集的元素和,其中唯一出现的元素和构成集合U(A,k)。在我们的例子中,我们发现U(B,3) = {10,12,14,18,21,25,27,29},因而sum(U(B,3)) = 156。
现在考虑有100个元素的集合S = {1^2, 2^2, … , 100^2}。 S有100891344545564193334812497256个子集恰好包含50个元素。
在这些子集的元素和中,找出那些唯一出现的元素和并求和,也即求sum(U(S,50))。
我的思路:dp.
设dp[338310][51]为从前i个元素里面选j个,组成元素的和为sum的情况,也就是dp[sum][j]. 直接暴力背包即可,时间复杂度338310*50*50=8e8,虽然很大但是几秒就出来了,然后对dp[x][50]统计所有是不是1的.如果是就res++.
请给我c++代码,记得开long long.
|