USACO中的动态规划问题

时间:2011-07-11 15:59:00

标签: dynamic-programming

在第2.2节中,一个名为“子集和”的问题要求您计算从1到n的整数集可以分成两个总和相同的集合的方式。

我知道复发是:

  

f [i] [j]:总结为j的方式的数量为1 ... i

     

F [i] [j] = F [I-1] [j] + F [I-1] [j-1]

如果初始条件是:

  

f [1] [1] = 1; //其他都为零,主循环从2开始

OR:

  

f [0] [0] = 1; //其他都为零,主循环从1开始

答案都是f [n] [n *(n + 1)/ 4]。这是否意味着初始条件不影响答案?

但如果我使用一维数组,请说f [N]:

让f [0] = 1,从1循环(所以f [0]实际上是f [0] [0]),答案是f [n] / 2

或f [1] = 1,从2循环(f [1]为f [1] [1]),答案为f [n]

我很困惑......

1 个答案:

答案 0 :(得分:5)

我不知道你是否仍然坚持这个问题,但对于遇到这个问题的其他人来说,这是一个解决方案。

让方法[i]成为使用数字1 ... N的子集获得i的总和的方式的数量。

然后它成为0-1背包算法的变体:

基本情况:方式[0] = 1

for (int i = 1; i <= N; i++) {
    for (int j = sum - i; j >= 0; --j) { //sum is n*(n+1)/2
        ways[j + i] += ways[j];
    }
}

您的答案位于[sum / 2] / 2。