题目描述
给定一个大小为n的递增不重复正数数组,从这个数组中找到k个数的和等于一个给定数target。计算出有多少种组合方式?要求复杂度尽可能低。
示例
输入数组:[1,2,3,4] ,k = 2, target = 5
输出答案:2
含义:两种方案[1,4],[2,3]
解答
#include <iostream>
#include <vector>
using namespace std;
const int N = 100;
class Solution{
public:
int ksum(vector<int>& nums, int k, int target) {
//f[i][j][p]表示前i个数中找出j个数且和等于t的方案数目。
int n = nums.size();
vector<vector<vector<int>>> dp(n+1, vector<vector<int>>(k+1, vector<int>(target+1,0)));
for (int i = 0; i < n+1; i++) {dp[i][0][0] = 1;}
for(int i = 1; i < n+1; i++) {
for(int j = 1; j < k+1; j++) {
for(int t = 1; t < target+1; t++) {
dp[i][j][t] = dp[i-1][j][t];
if(t - nums[i - 1] >= 0) {
dp[i][j][t] += dp[i-1][j-1][t-nums[i-1]];
}
}
}
}
return dp[n][k][target];
}
};
int main() {
vector<int> arr = {1,2,3,4};
int ans = Solution().ksum(arr, 2, 5);
cout << ans;
return 0;
}
参考
https://blog.csdn.net/loongkingwhat/article/details/100164890