2016-03-22 16 views
0

ile tuşları altdizilimlerden maksimum toplamı belirleyin sumof değerleri ileşöyle İki boyutlu dizi yaşıyorum verilen maksimum değere

farklı altdizilim 6, yukarıda dizi elemanlarının [4,3] [3,2] gibi değerlerinin toplamı ile [2,1] formu altdizilim 6 yani 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 

olan +1 = 6 Bu Dinamik Programlama kullanarak çözülebilir

+0

7 Lütfen toplam fonksiyonunuzu açıklayın, yani '3 + 3 + 4 + 3 = 7' nasıl? –

+1

@ChrisPickford OP sadece anahtar eklemek anlamına gelir. '3 + 3 + 2 = 8' –

+0

Bunlar anahtar/değer çiftleri değil, sıralı nesnelerdir. –

cevap

0

o DP veya bazik iteration.Any işaretçiler çözülebilir eğer

düzgün düşünmek mümkün değilim maksimum = 9/ipuçları yardımcı olacaktır yukarıdaki altdizilimlerden anahtarlarını toplamı her indeksin üzerinde yineleyebiliriz ve mevcut indeksi ya cevaplara ekleyebiliriz ya da görmezden gelmeyi seçebiliriz, o zaman problemin karmaşıklığını azaltmak için memoizasyon yapabiliriz.

Ben C++ bir özyinelemeli dinamik programlama çözümü yazdım

: Ideone üzerine çözümüne

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

Bağlantı: http://ideone.com/HMw9Sf

Not olduğu döndü cevap hayır çözüm için mümkün olduğu anlamına gelir ki -INF ise Verilen sumOfValues.

+0

Hala algınızı anlamanız gerekiyor, ancak bir DP probleminin nasıl çözüldüğünü ve bu çözümün nasıl ortaya çıktığını nasıl anlıyorsunuz? Bu sorun, yaygın bir DP probleminin varyantı mı? –

+2

@tim tom Bu, tam ağırlık toplamıyla "Sırt Çantası problemi" dir. – MBo

+0

Bu, bir alt küme toplamı sorununun varyantıdır. Https://en.wikipedia.org/wiki/Subset_sum_problem – uSeemSurprised