http://www.lintcode.com/zh-cn/problem/k-sum/
给定n个不同的正整数,整数k(k < = n)以及一个目标数字。
在这n个数里面找出K个数,使得这K个数的和等于目标数字,求问有多少种方案?
样例
给出[1,2,3,4],k=2, target=5,[1,4] and [2,3]是2个符合要求的方案
public class Solution {
/*
* @param A: An integer array
* @param k: A positive integer (k <= length(A))
* @param target: An integer
* @return: An integer
*/
//遍历
//此方法会溢出,因为k最多为16
public int kSum(int[] A, int k, int target) {
if(A==null || k==0) return 0;
int n = A.length;
int res=0;
for(int i=1<<k; i<(1<<n); i++){
int sum=0,count=0;
for(int j=0; j<n; j++){
if((i & (1<<j))!=0){
sum+=A[j];
count++;
if(sum>target || count>k)
break;
}
}
if(count==k && sum==target){
res++;
}
}
return res;
}
//dp
//二位0-1背包
//空间优化
public int kSum_dp_2(int[] A, int k, int target) {
if(A==null || k==0) return 0;
int n = A.length;
int res=0;
//dp的第一维只依赖于前一项,所以可以把第一维消除
int[][] dp = new int[target+1][k+1];
dp[0][0]=1;
for(int i=0; i<n; i++){
for(int t=k; t>=1; t--){
for(int j=target; j>=A[i]; j--){
dp[j][t] = dp[j-A[i]][t-1] + dp[j][t];
}
}
}
return dp[target][k];
}
};