【问题标题】:summary of the algorithm of K sumK sum的算法总结
【发布时间】: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.
  1. 习可以重复,解可以重复。

    6 个解是 {1,2,2}, {2,1,2}, {2,2,1}, {1,1,3}, {1,3,1}, {3,1 ,1}

  2. 习可以重复,解不能重复。

    2 个解是 {1,2,2}, {1,1,3}

  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


【解决方案1】:

在没有变量Kdp[i] 的解决方案中,表示有多少解决方案可以达到总和i

包含变量K 意味着我们为子问题添加了另一个维度。此维度不一定必须位于特定轴上。您的 dp 数组可能类似于 dp[i][k]dp[k][i]

  • dp[i][k] 表示使用k 数字(重复或唯一)累积和i 的解数
  • dp[k][i] 表示使用k 数多少个解来累积和i

两者都是一样的东西。这意味着您可以在外部或内部添加循环。

【讨论】:

  • 但是我尝试了最外层,得到了错误的结果。
  • 我认为外部是指以下序列:第一个循环将是带有目标的循环,第二个循环将用于 k,第三个循环将用于 vec.size()
  • 这个顺序对所有三种情况都是正确的,对吧?
  • 我会这么说。这完全取决于您的操作方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2018-10-10
  • 2013-07-03
  • 2018-05-21
  • 2012-07-19
相关资源
最近更新 更多