【发布时间】:2021-10-26 12:33:16
【问题描述】:
这是众所周知的Twelvefold way:
https://en.wikipedia.org/wiki/Twelvefold_way
我们想在哪里找到以下方程的解数:
X1 + X2 + ... + XK = target
来自给定的数组:
vector<int> vec(N);
我们可以假设vec[i] > 0。例如有3种情况
vec = {1,2,3}, target = 5, K = 3.
-
习可以重复,解可以重复。
6 个解是 {1,2,2}, {2,1,2}, {2,2,1}, {1,1,3}, {1,3,1}, {3,1 ,1}
-
习可以重复,解不能重复。
2 个解是 {1,2,2}, {1,1,3}
-
习不能重复,解不能重复。
0 解决方案。
ide 必须使用动态编程:
dp[i][k], the number of solution of target = i, K = k.
而迭代关系为:
if(i > num[n-1]) dp[i][k] += dp[i-num[n-1]][k-1];
对于三种情况,它们取决于 i,n,k 的运行顺序。我知道不限制 K(任意数量的变量之和)时的结果:
案例一:
int KSum(vector<int>& vec, int target) {
vector<int> dp(target + 1);
dp[0] = 1;
for (int i = 1; i <= target; ++i)
for (int n = 0; n < vec.size(); n++)
if (i >= vec[n]) dp[i] += dp[i - vec[n]];
return dp.back();
}
案例2:
for (int n = 0; n < vec.size(); n++)
for (int i = 1; i <= target; ++i)
案例3:
for (int n = 0; n < vec.size(); n++)
for (int i = target; i >= 1; --i)
当有额外的变量k时,我们只是简单地添加for循环
for(int k = 1; k <= K; k++)
在最外层?
编辑:
我试过case 1,只是在最里面添加K的for循环:
int KSum(vector<int> vec, int target, int K) {
vector<vector<int>> dp(K+1,vector<int>(target + 1,0));
dp[0][0] = 1;
for (int n = 0; n < vec.size(); n++)
for (int i = 1; i <= target; ++i)
for (int k = 1; k <= K; k++)
{
if (i >= vec[n]) dp[k][i] += dp[k - 1][i - vec[n]];
}
return dp[K][target];
}
情况2和情况3是这样吗?
【问题讨论】:
-
你能澄清你所说的“重复”是什么意思吗(并可能给案例举个例子)?也不清楚迭代条件和循环如何产生所需的答案,你能发布完整的伪代码吗?
-
@kcsquared 请看我的例子和不带 K 的完整代码
标签: algorithm