c++ - (可能是 NP-Hard)找到一个集合的子集总数,使得每个子集与其所有元素相乘时的值大于 X

标签 c++ algorithm

有一个大小为 n 的数组 arr。那么它的 2^n 子集中有多少个的总乘积大于某个数字(比如 X)?

n 约为 2^5,X 可以更大,约为 2^60(无论 C++ long 变量适合什么)

我认为类似于子集总和的东西会起作用,但我现在并不这么认为。


我从this question from a past contest想到了这一点来自 Codeforces。虽然这个问题不需要我问什么,但我很好奇。

最佳答案

您的问题可以通过动态编程按原样解决,即不使用日志。

当输入整数以二进制给出时(而不是 unary ), 你的问题是NP-hard在非自适应2查询减少下,因为:

number of subsets whose product equals X
=
number of subsets whose product is greater than X-1

number of subsets whose product is greater than X.

我没有立即看到任何显示实际 NP 硬度的方法(即,在 1 个查询减少下)。

关于c++ - (可能是 NP-Hard)找到一个集合的子集总数,使得每个子集与其所有元素相乘时的值大于 X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43970179/

相关文章:

c++ - 通过引用可变函数传递 A-N-D 数组

c++ - 如何在 Qt 中重新启动一个线程?

c++ - 如何加快这个盒子堆叠变化?

c++ - 将 double 分类到任意 bin 中

algorithm - 如何从未排序的正整数流中找到最小的缺失正整数?

c++ - 如何安全地关闭线程?

c++ - 当文件名包含宽字符时使用 ifstream

c++ - 检查 char * 类型的字符串是否包含另一个字符串

ruby - 计算具有特定子集大小的集合分区

algorithm - 如何解决 Codeforces 的 Twisty Movement?