2016-03-22 10 views
0

とキーのサブアレイの最大合計を決定する:6 =今、私はキーと合計値の最大合計でサブアレイを知りたいペア次のように私は2次元配列を持つ午前与えられた最大値

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

にsumof値を有する

異なるサブアレイは、6以上の配列要素[4,3]、[3,2]、などの値の和との[2,1]フォームサブアレイ6すなわち3 + 2ため

[[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 

であります+1 = 6 それはDPや基本的なiteration.Anyポインタ/ヒントによって解決できる場合、私はきちんと考えることができないのです最大

ある= 9上記サブアレイのキーの合計は、

+0

「3 + 3 + 4 + 3 = 7」の和の関数を説明してください。 –

+1

@ChrisPickford OPはキーのみを追加することを意味します。 '3 + 3 + 2 = 8' –

+0

これらはキーと値のペアではなく、配列オブジェクトです。 –

答えて

0

これは、動的計画法を用いて解くことができるのに役立ちます各インデックスについて繰り返し処理を行い、現在のインデックスを回答に追加するか、無視することができます。問題の複雑さを軽減するためにメモを取ることができます。

私はC++での再帰的な動的なプログラミングソリューション書かれている

:Ideoneのソリューションへ

#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; 
} 

がリンク:http://ideone.com/HMw9Sf

注答えが返された場合は何の解決策は可能ではなかったことを意味し、-INFであることを指定されたsumOfValues

+0

私はまだあなたのアルゴを理解する必要がありますが、そのDP問題と解決方法を思いついたのはどうですか?この問題は一般的なDP問題のいくつかの変形ですか? –

+2

@tim tomこれは正確な重量の合計で「ナップサック問題」です。 – MBo

+0

サブセットサム問題のバリエーションです。https://en.wikipedia.org/wiki/Subset_sum_problem – uSeemSurprised

関連する問題