0201 唯一子集和
* * * *
拉格朗日计划
* * * *
唯一子集和

记$S(A)$为集合A中所有元素的和。

考虑集合$B=\{1,3,6,8,10,11\}$,B共有20个大小为3的子集,这些子集的元素和分别是: \begin{align*} S(\{1,3,6\})&=10, \\ S(\{1,3,8\})&=12, \\ S(\{1,3,10\})&=14, \\ S(\{1,3,11\})&=15, \\ S(\{1,6,8\})&=15, \\ S(\{1,6,10\})&=17, \\ S(\{1,6,11\})&=18, \\ S(\{1,8,10\})&=19, \\ S(\{1,8,11\})&=20, \\ S(\{1,10,11\})&=22, \\ S(\{3,6,8\})&=17, \\ S(\{3,6,10\})&=19, \\ S(\{3,6,11\})&=20, \\ S(\{3,8,10\})&=21, \\ S(\{3,8,11\})&=22, \\ S(\{3,10,11\})&=24, \\ S(\{6,8,10\})&=24, \\ S(\{6,8,11\})&=25, \\ S(\{6,10,11\})&=27, \\ S(\{8,10,11\})&=29. \end{align*} 其中有些和出现了不止一次,也有一些和是唯一的。

令$U(A,k)$为A的所有大小为$k$的子集的唯一元素和所组成的集合,例如在上例中,$U(B,3)=\{10,12,14,18,21,25,27,29\}$,因而$S(U(B,3))=156$。

现考虑有100个元素的集合$X=\{1^2, 2^2, \ldots, 100^2\}$,该集合有100891344545564193334812497256个大小为50的子集。

求$S(U(X,50))$。

本题难度:



解答

比较麻烦的多维动态规划问题。

用$f(i,j,k)$表示集合$\{1^2,\ldots,i^2\}$中大小为j且和为k的子集数量,并规定空集的大小与和均为$0$,即$f(0,0,0)=1$。

那么对有效的取值$i,j,k$而言就有 $$f(i,j,k)=f(i-1,j,k)+f(i-1,j-1,k-i^2).$$ 其中等式右侧的两项分别表示满足要求但不含$i^2$和满足要求且包含$i^2$的子集数量。

所谓有效的取值是指逻辑上有意义,例如显然j应该小于i,k不能小于0等等,无效取值一律赋0。

此外,子集数量可能很多,因此把大于等于2数一律赋作2。

最终结果是$115039000$。

m=295425
f=[[0]*(m+1) for j in range(51)]
f[0][0]=1
s=0
for i in range(101):
    s+=i*i
    for j in range(min(50,i),0,-1):
        for k in range(min(m,s),i*i-1,-1):
            f[j][k]=min(2,f[j][k]+f[j-1][k-i*i])
    print i
print sum(k for k in range(m+1) if f[50][k]==1)