参考点击打开链接
原文说的很好,尤其是
使用三维动规数组dp[i][j][t]
,表示从0
遍历到A[i]
后找到的j
个元素之和为t
的情况的总数。最后返回从整个A
数组找到的k
个元素之和为target
的情况总数即可。
其余的就过遍数即可。
/**
* @param A: an integer array.* @param k: a positive integer (k <= length(A))
* @param target: a integer
* @return an integer
*/
public int kSum(int A[], int k, int target) {
// write your code here
if (A == null || A.length < k) {
return 0;
}
int [][][] matrix = new int[A.length + 1][k + 1][target + 1];
for (int i = 0; i <= A.length; i++) {
matrix[i][0][0] = 1;
}
for (int i = 1; i <= A.length; i++) {
for (int j = 1; j <= k && j <= i; j++) {
for (int t = 1; t <= target; t++) {
matrix[i][j][t] = matrix[i - 1][j][t];
if (A[i - 1] <= t) {
matrix[i][j][t] = matrix[i][j][t] + matrix[i - 1][j - 1][t - A[i - 1]];
}
}
}
}
return matrix[A.length][k][target];
}