static int ksum_helper(int[]A, int i, int j, int k, int[][][]dp) {
		int n=A.length;
		if (i<0||j<0||k<0||j==n)
			return 0;
		if (dp[i][j][k]!=-1)
			return dp[i][j][k];
		int val=0;
		if (i==1) {
			for (int s=j; s<n;++s)
				if (A[s]==k)
					++val;
			return dp[i][j][k]=val;
		} else if (i==2) {
			for (int l=j, r=n-1; l<r;) {
				int sum=A[l]+A[r];
				if (sum==k) {
					++val;
					++l;
					--r;
				} else if (sum<k) {
					++l;
				} else {
					--r;
				}
			}
			return dp[i][j][k]=val;
		} else {
			val+=ksum_helper(A,i,j+1,k,dp);
			val+=ksum_helper(A,i-1,j+1,k-A[j],dp);
			return dp[i][j][k]=val;
		}
	}