子集和变化(?)与2D数组,负数和欺骗

时间:2018-03-07 15:41:33

标签: c# algorithm dynamic divide-and-conquer

我已经把头撞到了墙上好几天,因为我觉得我错过了一些大事。我有一个2D数组(大小为n,4)和所需的总和。通过从每列添加一个元素,允许负数和重复来达到总和。输出是所需总和的组合数。

天真的方法是获得选择的变化并添加,即:

for 7 rows, 4 columns
if ([0,0] + [0,1] + [0,2] + [0,3] == sum)
    matches++;
if ([0,0] + [0,1] + [0,2] + [1,3] == sum)
    matches++;
...
down to 
if ([6,0] + [6,1] + [6,2] + [6,3] == sum)
    matches++;
output matches

这需要N ^ 4次。不是很好。我正在努力的方法是减少这个(或至少是一个起点)和/或分解问题。它似乎最接近子集求和问题,但我们甚至没有涵盖动态编程,所以我不知道。

我当前的想法是将整个数组视为一个单独的集合,它们是某种类(最可能是K / V对或散列表),我可以设置一个值来比较和一个列“flag”,返回匹配的所有子集,并抛出任何重复的列或不等于列数的集合。从我正在阅读的内容来看,我无法判断是否在列之间重复(同一列可以在创建集时自动丢弃)导致有效总和会让我失望,但似乎对于大多数方法是的,如果他们甚至可以处理否定的话。

here这样的表格方法只是看起来它可以成为我见过的起点。我至少是在正确的轨道上,还是我离开了点并使它太复杂了?

0 个答案:

没有答案