给定一个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)
如果我们把它看作是在从结束到开始的过程中减去成本,寻找最小的剩余非负量,那么一个幼稚的重复可能是如下所示。回忆录递归有时比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,它能以更好的方式实现吗,因为数组中元素的数量限制非常大