在第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]
我很困惑......
答案 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。