将其分解为三个参数的一种方法是:
x: maximum index of item considered for inclusion in subset
n: number of items in subset
s: sum of subset
基本情况是 C[0,0,0] = true,C[0,i > 0,j > 0] = false
递归情况是:
C[i,n+1,s+a_i] = C[i-1,n,s] // use item i
C[i,n,s] = C[i-1,n,s] // dont use item i
这使用空间 O(n^2 * max(a_i)) (可以通过丢弃使用时的 C[i, , ] 减少到 O(n*max(a_i)))
然后只需在 z 附近搜索 C[n,i,j] 以获得最终答案。
作为一个循环...
for (int i = 1; i <= n; i++)
{
C[i,n+1,s+a_i] ||= C[i-1,n,s];
C[i,n,s] ||= C[i-1,n,s];
}
作为递归函数:
bool C(int maxindex, int size, int sum)
{
if (memoize(maxindex, size, sum))
return cached;
if (maxindex == 0)
return (size == 0 && sum == 0);
return
C(maxindex-1, size-1, sum - A[maxindex]) || // version using A[maxindex]
C(maxindex-1, size, sum); // version not using A[maxindex]
}