【问题标题】:Determine maximum sum of keys subarrays with given max value确定具有给定最大值的键子数组的最大总和
【发布时间】:2023-04-06 19:38:01
【问题描述】:

我有如下二维数组:成对

3,3 
4,3
3,2 
2,2
2,1 

现在我想找出键总和最大且值总和 =6 的子数组

总和为 6 的不同子数组是

[[3,3],[4,3]] ,Sum = 7
[[3,3],[3,2],[2,1]] ,Sum = 8
[[3,3],[2,2],[2,1]] ,Sum = 7
[[4,3],[3,2],[2,1]],sum = 9
[[4,3],[2,2],[2,1]],sum =8

对于上述数组元素[4,3] [3,2],[2,1]形成子数组,其值之和为6,即3+2+1 =6 以上子数组的键之和=9,最大

如果它可以通过 DP 或基本迭代解决,我无法正确思考。任何指针/提示都会有所帮助

【问题讨论】:

  • 请解释一下你的求和函数,即3+3+4+3=7如何?
  • @ChrisPickford OP 表示仅添加键。 3+3+2 = 8
  • 那些不是键/值对,它们是数组对象。

标签: algorithm


【解决方案1】:

这可以使用动态编程来解决,我们可以遍历每个索引并且可以将当前索引添加到答案中或选择忽略它,然后我们可以记忆以降低问题的复杂性。

我用 c++ 写了一个递归动态编程解决方案:

#include <iostream>
#define INF 100000000
using namespace std;

int arr[100][2], sumOfValues, n, dp[100][10000];

int solve(int index, int currentSum){
    if(index == n){
        if(currentSum == sumOfValues) return 0;
        else return -INF;
    }
    if(dp[index][currentSum] != -1) return dp[index][currentSum];
    int v1 = solve(index+1, currentSum + arr[index][1]) + arr[index][0];    //take current element
    int v2 = solve(index+1, currentSum);    //do not take current element
    return dp[index][currentSum] = max(v1, v2);
}

int main() {
    n = 5;
    sumOfValues = 6;
    arr[0][0] = 3;arr[0][1] = 3;
    arr[1][0] = 4;arr[1][1] = 3;
    arr[2][0] = 3;arr[2][1] = 2;
    arr[3][0] = 2;arr[3][1] = 2;
    arr[4][0] = 2;arr[4][1] = 1;
    for(int i = 0;i < 100;i++) for(int j = 0;j < 10000;j++) dp[i][j] = -1;
    cout << solve(0, 0) << endl;
    return 0;
}

Ideone 上的解决方案链接:http://ideone.com/HMw9Sf

请注意,如果返回的答案是 -INF,这意味着对于给定的 sumOfValues 没有解决方案。

【讨论】:

  • 我仍然需要了解您的算法,但是您如何确定这是一个 DP 问题以及您是如何提出解决方案的......这个问题是常见 DP 问题的一些变体吗?跨度>
  • @tim tom 这是Knapsack problem,权重总和准确。
  • 另请注意,它不是多项式时间算法,而是伪多项式多项式时间算法,我的意思是它的复杂性取决于输入,即这里它取决于 sumOfValues 约束。跨度>
猜你喜欢
  • 2014-08-07
  • 2016-05-27
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 2013-02-24
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多