• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pytanie - CanSum

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
71 wizyt
pytanie zadane 22 stycznia w C i C++ przez Dani Użytkownik (790 p.)
#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

int canSum(int TargetSum, vector<int> numbers,unordered_map<int,int> memo) {
	if (memo.find(TargetSum) != memo.end()) return memo[TargetSum];
	if (TargetSum == 0) return true;
	if (TargetSum < 0) return false;
	for (int x : numbers) {
		int remainder = TargetSum - x;
		if (canSum(remainder, numbers, memo)) {
			memo[TargetSum] = true;
			return true;
		}
	}
	memo[TargetSum] = false;
	return false;
}

int main()
{
	unordered_map<int, int> memo;
	/*cout << canSum(7, { 2,3 }, memo) << '\n';
	cout << canSum(7, { 5,3,4,7 }, memo) << '\n';
	cout << canSum(7, {2, 4 }, memo) << '\n';
	cout << canSum(8, {2,3,5}, memo) << '\n';*/
	cout << canSum(300, {7,14}, memo) << '\n';
}

Witam, napisałem kod, który powinien być szybszy i wykonywać ostatni element w szybszym czasie, używając mapy która przechowuje nam pewne wartości, jednak program nie wyświetla ostatniego zapytania zbyt szybko. Co mogłem przeoczyć?

1 odpowiedź

+2 głosów
odpowiedź 22 stycznia przez mokrowski Mędrzec (155,040 p.)
Za każdym razem przesyłasz kopię mapy a nie referencję do niej.
komentarz 22 stycznia przez pasjonat_algorytmiki Stary wyjadacz (12,260 p.)
Dokładnie i złożonnośc ci bardzo spada
komentarz 22 stycznia przez Dani Użytkownik (790 p.)
Panowie, uratowaliście mi życie! Dzięki wielkie.

Czy jak nie mam refernecji do vectora to też mu tutaj złożonośc spada?
komentarz 22 stycznia przez pasjonat_algorytmiki Stary wyjadacz (12,260 p.)
On go kopiuje całego wtedy.

Możesz albo wyciągnąc vector i mapę przed maina i wtedy masz globalny, najszybciej

Albo właśnie referencję przekazać.

W programowaniu konkursowym np. OI, OIJ, potyczki itp. zazwyczaj robi się większość globalnie, żeby się nie męczyć.
komentarz 22 stycznia przez Dani Użytkownik (790 p.)
Ej bo jednak sprawdzam jeszcze raz poprawność tego problemu, i wychodzi inny wynik gdy daję referencję niż kopiuję go. W czym może być problem?

Edit : Muszę clearować mapę po każdym pytaniu
komentarz 22 stycznia przez Great Stary wyjadacz (10,740 p.)

Takie tam prowizoryczne rozwiązanie:

#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

int canSum(int TargetSum, const vector<int>& numbers, unordered_map<int, int>& memo) {
    if (memo.find(TargetSum) != memo.end()) return memo[TargetSum];
    if (TargetSum == 0) return true;
    if (TargetSum < 0) return false; 
    for (int x : numbers) {
        int remainder = TargetSum - x;
        if (canSum(remainder, numbers, memo)) {
            memo[TargetSum] = true;
            return true;
        }
    }

    memo[TargetSum] = false;
    return false;
}

int canSum(int TargetSum, const vector<int>& numbers) {
    unordered_map<int, int> memo;
    return canSum(TargetSum, numbers, memo);
}

int main()
{
    cout << canSum(7, { 2,3 }) << '\n';
    cout << canSum(7, { 5,3,4,7 }) << '\n';
    cout << canSum(7, {2, 4 }) << '\n';
    cout << canSum(8, {2,3,5}) << '\n';
    cout << canSum(300, { 7,14 }) << '\n';
}

Może warto zrezygnować z rekurencji.

komentarz 22 stycznia przez mokrowski Mędrzec (155,040 p.)
Jeśli chcesz mieć tę memoizację, to deklaruj mapę statycznie w funkcji. C++ gwarantuje inicjalizację jej przy pierwszym wejściu.

Podobne pytania

+1 głos
1 odpowiedź 96 wizyt
pytanie zadane 22 kwietnia 2022 w C i C++ przez polandonion Mądrala (6,410 p.)
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 31 sierpnia 2020 w C i C++ przez p4wix Obywatel (1,020 p.)
0 głosów
2 odpowiedzi 100 wizyt
pytanie zadane 15 lutego 2016 w C i C++ przez Kazik98x Obywatel (1,800 p.)

90,818 zapytań

139,493 odpowiedzi

313,553 komentarzy

60,311 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...