标签:rip 代码实现 数组 数据 表示 active 目标 interview header
原题网址:https://www.lintcode.com/problem/k-sum/description
给定n个不同的正整数,整数k(k < = n)以及一个目标数字。
在这n个数里面找出K个数,使得这K个数的和等于目标数字,求问有多少种方案?
给出[1,2,3,4],k=2, target=5,[1,4] and [2,3]是2个符合要求的方案
dp[i][j][t]=dp[i-1][j][t];
if (t>=A[i])//注意是大于等于;
{
dp[i][j][t]+=dp[i-1][j-1][t-A[i]];
}
意思就是,每个元素都有两种状态,取或者不取:
(1)若不取A[i]这个值,当前方案数等于从前i-1个数中取j个使其和为t的方案数,即dp[i - 1][j][t]。
(2)若取当前值A[i],则当前方案数等于从前i-1个数中取j个使其和为t的方案数再加上考虑A[i]的情况,即dp[i - 1][j - 1][t - A[i]](前提是t - A[i]要大于等于0)。
class Solution {
public:
/**
* @param A: An integer array
* @param k: A positive integer (k <= length(A))
* @param target: An integer
* @return: An integer
*/
int kSum(vector<int> &A, int k, int target) {
// write your code here
int size=A.size();
if (target<0)
{
return 0;
}
vector<vector<vector<int>>> dp(size+1,vector<vector<int>>(k+1,vector<int>(target+1,0)));
for (int i=0;i<=size;i++)
{
for (int j=0;j<=k;j++)
{
for (int t=0;t<=target;t++)
{
if (j==0&&t==0)//前i个数中取0个和为0只有一种方案,就是不取任何数;
{
dp[i][j][t]=1;
}
else if (!(i==0||j==0||t==0))
{
dp[i][j][t]=dp[i-1][j][t];
if (t>=A[i-1])//注意是大于等于;
{
dp[i][j][t]+=dp[i-1][j-1][t-A[i-1]];
}
}
}
}
}
return dp[size][k][target];
}
};
class Solution {
public:
/**
* @param A: An integer array
* @param k: A positive integer (k <= length(A))
* @param target: An integer
* @return: An integer
*/
int kSum(vector<int> &A, int k, int target) {
// write your code here
int result=0;
if (A.empty())
{
return result;
}
ksum(A,k,target,0,0,0,result);
return result;
}
void ksum(vector<int> &A, int k, int target,int sum,int ind,int size,int &result)
{
if (size==k)
{
if (sum==target)
{
result++;
}
return ;
}
if (ind>=A.size())
{
return ;
}
ksum(A,k,target,sum+A[ind],ind+1,size+1,result);
ksum(A,k,target,sum,ind+1,size,result);
}
};
标签:rip 代码实现 数组 数据 表示 active 目标 interview header
原文地址:https://www.cnblogs.com/Tang-tangt/p/9383772.html