当前位置: 首页 > 知识库问答 >
问题:

正和

马博学
2023-03-14

相反的问题:

正和最大长度子序列

解决方案非常简单:

int solve(const vector<int> &A, int K) {
    int dp[A.size()+1][K+1];
    int i, j;

    // Base Cases
    for(i=0; i<= K; i++)
        dp[0][i] = 0;
    for(i=0; i<= A.size(); i++)
        dp[i][0] = 0;


    for(i=1; i <= A.size(); i++)
    {
        for(j=1; j<= K; j++)
        {
            dp[i][j] = dp[i-1][j];
            if(A[i-1] <= j)
                dp[i][j] = max(dp[i][j], 1 + dp[i-1][j-A[i-1]]);
        }
    }
    return dp[A.size()][K]

我很难思考最小长度子序列如何与总和

例子:

A = [14, 10, 4]
K = 14
Minimum Length Subsequence = 14
Maximum Length Subsequence = 10, 4 (Arrived from Knapsack)

当然,这不像将最大值更改为最小值那么容易,因为答案应该始终是基本情况。这让我想,我们需要调整基本情况吗?我被困在这里,需要推一下。

关于如何解决这个问题有什么想法吗?

共有3个答案

邴修远
2023-03-14

我认为这是沿着你正在寻找的路线。在检查是否可以达到总和时,我们必须比您的最大子序列公式更加小心。在这个公式中,dp[i][j]是对j的最小子序列求和,考虑到高达A[i]的元素(因此i不是子序列长度)。

JavaScript代码(仅经过轻微测试):

function solve(A, K) {
  let i,j;

  let dp = new Array(length);

  for (i=0; i<A.length; i++)
    dp[i] = new Array(K + 1);

  // Base Cases
  for(i=0; i<A.length; i++)
    dp[i][0] = 0;

  for (i=0; i<A.length; i++){
    // Exact match
    if (A[i] == K)
      return 1;

    // We can reach this sum with only one element
    if (A[i] < K)
      dp[i][A[i]] = 1;
    
    // There are no previously achieved sums
    if (i == 0)
      continue;
    
    for (j=1; j<=K; j++){
      dp[i][j] = dp[i][j] || dp[i - 1][j];

      if (A[i] <= j){
        dp[i][j] = Math.min(
          dp[i][j] || Infinity,
          1 + (dp[i - 1][j - A[i]] || Infinity)
        );
      }
    }
  }
  
  for (i=K; i>=0; i--)
    if (![undefined, Infinity].includes(dp[A.length - 1][i]))
      return dp[A.length - 1][i];
}

console.log(solve([1,2,3,4,5,6,7,8,9,10], 11));
console.log(solve([14,10,4], 14));
console.log(solve([0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0], 8));
console.log(solve([7,7,2,3],15))
盖和泰
2023-03-14

下面的代码片段显示了我所说的筛子是什么意思。这是一个简单的解决方案,可能对大量输入没有用。它不像筛子来寻找素数,它只包含真或假,而更像是组合及其总和的字典,例如:

{value: 14, components: [4, 10]}  

如果您不熟悉Javascript,数组的行为更像关联数组或带有字符串键的字典(这就是需要数字转换的原因),并且for in仅在数组稀疏时迭代具有值的元素。此外,切片conat创建数组的副本。

function minSub(array, target) {
    var sieve = [[]];
    for (var i in array) {
        var temp = [];
        for (var j in sieve) {
            var val = Number(j) + array[i];
            if (!sieve[val] || sieve[val].length > sieve[j].length + 1) {
                temp[val] = sieve[j].concat([array[i]]);
            }
        }
        for (var j in temp) {
            if (Number(j) <= target) {
                sieve[j] = temp[j].slice();
            }
        }
    }
    var max = 0;
    for (var j in sieve) {
        if (Number(j) > max) {
            max = Number(j);
        }
    }
    return sieve[max];
}

console.log(minSub([4, 10, 14], 14));
console.log(minSub([0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0], 8));
翟俊名
2023-03-14

用有序对< code>(sum,length)替换和。现在应用你知道的前一个算法。顺序是字典式的,先按总数,再按长度。您正在尝试接近< code>(target_sum,0)。

现在最接近的“和”将是具有最小正差的最短子序列。

 类似资料:
  • 我在解决一个问题,它说明我们需要找到所有最小数的和,这些最小数需要添加到数组中的元素中,以使按位和大于0。 我的方法是:首先,我决定在所有元素中找到最右边集合的位置,并检查要添加的总的最小数目,以便and大于零。但这是行不通的,有谁能帮我找到另一种Algo吗?

  • 本文向大家介绍L1和L2正则相关面试题,主要包含被问及L1和L2正则时的应答技巧和注意事项,需要的朋友参考一下 参考回答: L范数(L1 norm)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。比如 向量A=[1,-1,3],那么A的L1范数为 |1|+|-1|+|3|.简单总结一下就是: L1范数: 为x向量各个元素绝对值之和。 L2范数

  • 我已经在如下所示的过滤器中实现了错误处理: 如果响应带有一个主体,那么< code > response . bodytomono(string . class ),这样做应该没问题。平面地图(...)被执行。然而当身体是空的时候,什么都不会发生,但是我想要的是也处理错误。我的理解是,我会这样做: 这不起作用,因为预期返回的类型是Mono而不是Mono。 我如何在有响应体和无响应体的情况下实现对错

  • 开始前,我假设你:0)具备基本的 vim 操作能力,清楚如何打开/编辑/保存文档、命令与插入模式间切换;1)希望将 vim 打造成 C/C++ 语言的 IDE,而非其他语言。 关于 vim 的优点,你在网上能查到 128+ 项,对我而言,只有两项:0)所思即所得,让手输入的速度跟上大脑思考的速度,1)所需即所获,只有你想不到的功能、没有实现不了的插件。希望获得前者的 能力,你需要两本教程深入学习,

  • 正则匹配,如果是单个则模式是使用的PREG_SET_ORDER。 示例 <?php namespace Yurun\CrawlerApp\Module\YurunBlog\Article\Model; use Yurun\Crawler\Module\Parser\Annotation\RegularMatch; use Yurun\Crawler\Module\DataModel\Contra

  • 我想检查我的pandas列中的字符串是否遵循特定模式。我想用一个函数check\u模式和一个正则表达式来实现。除前两位后面有一个破折号外,数据只能由位数以外的数字组成。正确值为08-15643。错误值可能为07-456d、04-47897-1、084564等。) 请看一下数据和我的代码: 我的输出应该是原始的数据帧df,带有一个额外的列Correct\u模式。给定数据df后,该列的结果应为True