将这个问题分解成三个参数的一种方法是:
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)))
最终答案可以在C[n,i,j]中搜索j接近z的值。
作为一个循环...
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]
}