我有二维数组如下:在
中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或基本迭代解决,我无法正确思考。任何指针/提示都会有帮助
答案 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无法解决。