确定具有给定最大值的键子阵列的最大总和

时间:2016-03-22 11:30:40

标签: algorithm

我有二维数组如下:在

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

现在我想找出具有最大键总数且其总和值= 6

的子阵列

具有sumof值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或基本迭代解决,我无法正确思考。任何指针/提示都会有帮助

1 个答案:

答案 0 :(得分:0)

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

我用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无法解决。