大小为 K 的子集的乘积之和

Posted

技术标签:

【中文标题】大小为 K 的子集的乘积之和【英文标题】:Sum of Products of subsets of size K 【发布时间】:2019-09-09 14:51:22 【问题描述】:

给定n个元素的集合,求大小最多为k(k是另一个整数)的子集的乘积之和。

n 的范围在 1000 秒内,所以我需要比指数时间复杂度更快的东西。

我觉得这个问题可以使用多项式 FFT 来解决,但我不确定。 另外,请查看https://math.stackexchange.com/questions/786183/sum-of-multiplication-of-all-combination-of-m-element-from-an-array-of-n-element/788655#788655

例如:

S : 1, 2, 3, 4, 5

k = 2

那么答案就是

1 + 2 + 3 + 4 + 5 + 1*2 + 1*3 + 1*4 + 1*5 + 2*3 + 2*4 + 2*5 + 3*4 + 3*5

非常感谢伪代码或只是一些关于如何更接近解决方案的指针。

【问题讨论】:

你可能想看看这个。 ***.com/questions/10106193/… 【参考方案1】:

令 DP[i][j]:大小正好为 j 且仅包含第 [1~i] 个元素的子集的乘积之和。

那么 DP[i][j] = DP[i-1][j] + DP[i-1][j-1] * arr[i]

现在您可以在时间复杂度 O(NK) 上解决它。

== 编辑 ==

这是一个简单的代码。

int arr[1002]; /// The array where number is located
int DP[1002][1002];
int ans=0; /// final answer
DP[0][0] = 1;
for(int i=1; i<=n; i++)
    DP[i][0] = 1;
    for(int j=1; j<=i && j<=k; j++)
        DP[i][j] = DP[i-1][j] + DP[i-1][j-1] * arr[i];
    

for(int i=1; i<=k; i++) ans+=DP[n][i];

【讨论】:

只是为了扩展这一点,您只需使用上述规则和双循环填写一个表格。然后DP[n][k] 就是你的答案。 基本条件是什么? 基本条件是:DP[0][0] = 1 目前还不清楚。你能发布一个正确的伪代码吗?

以上是关于大小为 K 的子集的乘积之和的主要内容,如果未能解决你的问题,请参考以下文章

枚举大小为k的子集

总和小于 M 的大小为 K 的子集的最大总和

所有长度为 k 的子数组的元素的乘积之和

具有固定子集大小的 Sum-subset

通过从每个集合中仅选择一个值来选择 k 个大小的子集

给定大小的非相邻集的数量