1
$\开始组$

假设我们得到了一个持续时间列表(5s、10s、10s,15s、15s、15s,25s、30s……),我们想找到一个唯一持续时间可以使用此单持续时间列表创建。

例如,如果我们有原始列表(5、5、15、25),我们可以创建以下持续时间:

  • 5->使用一个5元素
  • 10->使用两个5元素
  • 15->使用一个15元素
  • 20->使用一个5元素和一个15元素
  • 25->使用两个5元素和一个15元素或使用25元素
  • 30->使用25和5
  • 35->使用25和两个5s
  • 40->使用25和15
  • 45->使用25、15和5
  • 50->使用所有元素

作为奖励,我想限制使用的元素数量,并设置一个上限。例如,我想使用最多2个元素,并且总持续时间为37的上限。

这应该消除40、45和50选项,因为它们超出了限制,并且应该消除35选项,因为它使用了2个以上的元素。

有人知道解决这个问题的方法吗?

$\端组$
7
  • 1
    $\开始组$ 含糊不清。你只使用加法吗?在问题中陈述 $\端组$
    – 科德鲁
    评论 3月25日13:02
  • $\开始组$ @科德鲁,我很想知道$\text{minute}^2$是什么意思,而不仅仅是它作为加速度单位的一部分意味着什么。然而,好观点! $\端组$ 评论 3月25日13:14
  • $\开始组$ 我建议你用5美元而不是1美元试试帕斯卡的三角形。如果成功了,你能给我们回电话吗。 $\端组$ 评论 3月25日13:16
  • $\开始组$ 您是否在问“给定一个正整数数组,我如何从该数组中找到长度最多为$k$的子序列中最多$M$的所有和?”这很可能适用于动态编程,尤其是如果您知道整个列表的和不太大。这个是这种方法的一个例子,尽管它写得不是很清楚。我认为这个问题可能更适合某个编程网站。 $\端组$ 评论 3月25日13:56
  • $\开始组$ @科德鲁是唯一的加法。 $\端组$ 评论 3月26日8:54

1答案1

重置为默认值
0
$\开始组$

您可以递归计算列表中每个前缀的答案:添加条目时x美元$在列表中,总和集变为S\}中的$S\mapsto S\cup\{x+a|a\$(然后从单例集开始$\{0\}$输入列表为空时)。保持美元$作为一个排序列表,可以在$O(百万\log(n))$时间,其中百万美元$是输入列表的长度n美元$是输出列表的长度(先验值为O美元(200万)$).

如果要将摘要数限制为百万美元$,然后保留一个成对列表(sum,summand的数量),这将复杂性更改为$O(mMn\log(Mn))$.

如果你想给总和设一个上限,那么就删减集合美元$每次更新后。这不会使时间复杂度恶化,尽管如果上限十亿美元$足够小,则可以用长度为布尔值的数组替换排序列表美元\sim B$(或MB美元$如果您希望这两个限制)将复杂性更改为O美元(百万亿)$(或O美元(百万MB)$).

$\端组$

你必须登录来回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.