Given n distinct positive integers, integer k (k <= n) and a numbertarget.
Find k numbers where sum is target. Calculate how many solutions there are?
Example
Given [1,2,3,4]
, k = 2
, target = 5
.
There are 2
solutions: [1,4]
and [2,3]
.
Return 2
.
可以使用dp来做:
dp[i][j][sum]表示前i个数里面抽取j个数,和为sum的个数:
所以:dp[i][j][sum] = dp[i-1][j][sum] + dp[i-1][j-1][sum-A[i-1]];
c++实现:
class Solution {
public:
/**
* @param A: an integer array.
* @param k: a positive integer (k <= length(A))
* @param target: a integer
* @return an integer
*/
int kSum(vector<int> A, int k, int target) {
// wirte your code here
const int l = A.size()+1;
const int m = k +1;
const int n = target +1;
int dp[l][m][n];
for (int i = 0; i< l; i++) {
for (int j = 0; j < m; j++) {
for (int sum =0; sum< n;sum++) {
dp[i][j][sum]=0;
}
}
}
for (int i=0;i<l;i++)
dp[i][0][0]=1;
for (int i=0; i<A.size(); i++) {
for (int j =1; j <=k; j++) {
for (int sum = 0; sum <= target; sum++){
dp[i+1][j][sum]=dp[i][j][sum];
if (sum - A[i] >=0)
dp[i+1][j][sum]+=dp[i][j-1][sum-A[i]];
}
}
}
return dp[A.size()][k][target];
}
};