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

和小于或等于给定数的二维数组中的最大代价值

郑景胜
2023-03-14

给定一个2D数组和一个数字k

问题:我们有一个矩阵cost[][],矩阵的每个单元格表示遍历该单元格的成本。我们从左上角(0,0)开始,我们必须到达最后一个单元格(右下角)。我必须编写一个函数,返回到达(m,n)而不超过k的最大代价路径的代价。

如果找不到最大和小于或等于k的路径,则返回-1,矩阵的值不能为负

解决方案:我尝试了很多代码,但没有一个返回我期望的结果。

我的第一个解决方案是在一个简单的数组中转换2D数组,并应用背包算法,但它不起作用,因为逻辑上没有遵循路径。(练习的逻辑随着这个想法消失了)

    if we had this 3*3 matrix:
    cost[][] = {{2,3,1}, {6,1,9},{8,2,3}}
    and k = 7

答案应该是6:(0,0)->(1,1)->(3,3)

共有1个答案

淳于恺
2023-03-14

如果我们把它看作是在从结束到开始的过程中减去成本,寻找最小的剩余非负量,那么一个幼稚的重复可能是如下所示。回忆录递归有时比k全维度上的迭代更适合,因为许多输入可以产生特殊的和集。

function g(m, K, i, j, k, memo){
  if (k < 0 || i < 0 || j < 0)
    return K + 1;

  if (i == 0 && j == 0)
    return k >= m[i][j] ? k - m[i][j] : K + 1;
    
  const key = String([i, j, k]);
  
  if (memo.hasOwnProperty(key))
    return memo[key];
    
  return memo[key] = Math.min(
    g(m, K, i-1, j, k - m[i][j], memo),
    g(m, K, i, j-1, k - m[i][j], memo),
    g(m, K, i-1, j-1, k - m[i][j], memo)
  )
}

function f(m, k){
  return k - g(m, k, m.length-1, m[0].length-1, k, {});
}

var m = [
  [2,3,1],
  [6,1,9],
  [8,2,3]
];

var k = 7;

console.log(f(m, k));
 类似资料:
  • 这个问题有多项式解吗?如果有,你能呈现吗?

  • 我想找到给定正整数数组中元素的最大数目,使得它们的和小于或等于给定的k。例如,我有一个数组 答案是3,因为1,2,3是求和6的最大元素。

  • 我有一个大小为的整数值数组和一个给定的。 我想找到子序列的总数,使得每个子序列的元素总和小于。例如:设 ,,数组的元素为 ,则其总子序列为 作为- 但是,所需的子序列是: 也就是说,不被取,因为它的元素和是,这大于,即

  • 我的问题很简单,但我不知道如何解决我想要的。我必须找到小于给定数字的最大数素数,如果不存在则打印消息。 代码是有效的,如果数字是10,它会打印7,但我想做2个新的修改,我找不到解决方案。例如,如果给定的数字是1,我的程序应该如何修改以打印消息?我试着写一个if-else,但是如果我用if修改了while,这将不会有帮助。第二件事,如果给定的数是素数,代码仍然会找到比给定数少的数。如果我给数字7,输

  • 给定一个数组形式的未排序(多)整数集,求其和大于或等于常量整数x的最小基数子集。 我们的集合是{4 5 8 10 10},x=15,所以最小基数子集和 这个问题与以下问题相关但不同:给定一个n个整数的列表,找到大于X的最小子集和在前面的问题中,作者要求得到一个和最接近X的子集,这里我们想要任何子集

  • 我知道一个O(n2)soln,它能以更好的方式实现吗,因为数组中元素的数量限制非常大