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

dynamic programming tablica 10^9

Object Storage Arubacloud
0 głosów
154 wizyt
pytanie zadane 13 września 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)

https://codeforces.com/problemset/problem/996/A

Jest taki problem, no i rozwiazalem go greedy approachem:

#include <iostream>
 
using namespace std;
 
int main()
{
int n;
cin>>n;
int c=0;
while (n>0)
{
    if (n-100>=0)
    {
        n-=100;
        c++;
    }
    else if (n-20>=0)
    {
        n-=20;
        c++;
    }
    else if (n-10>=0)
    {
        n-=10;
        c++;
    }
    else if (n-5>=0)
    {
        n-=5;
        c++;
    }
    else if (n-1>=0)
    {
        n-=1;
        c++;
    }
}
cout<<c;
}

ale tez chcialem jak szef, i uzyc dynamic programming i mam tak:

#include <iostream>

using namespace std;

int main()
{
long long int n;
cin>>n;
long long int dp[n];
dp[0]=0;
int coins[5]={1,5,10,20,100};
for (long long i=1; i<n; i++)
    dp[i]=n+1;
for (long long i=1; i<=n; i++)
    for (int j:coins)
        if (i<j)
            continue;
        else
            dp[i]=min(dp[i], dp[i-j]+1);
cout<<dp[n];
}

no dalem wszedzie long longa zamiast inta ale i tak test: 

1000000000

crashuje, domyslam sie ze nie moge tworzyc tak duzych tablic, jak sobie z tym poradzic?

komentarz 13 września 2020 przez NewEraOfPeace Gaduła (4,790 p.)
edycja 13 września 2020 przez NewEraOfPeace

Alokujesz na stosie (VLA) tablicę o wielkości 10^9*8B, nie dziw laugh

komentarz 13 września 2020 przez tkz Nałogowiec (42,000 p.)
VLA nie jest równoważne z alokacja na stosie.
komentarz 15 września 2020 przez TOM_CPP Pasjonat (22,640 p.)

@lujasjeden,
W pętli masz odwołanie do elementu spoza zakresu tablicy dp, co jest UB, tym bardziej że zapisujesz tam wynik z funkcji min.

1 odpowiedź

0 głosów
odpowiedź 13 września 2020 przez tangarr Mędrzec (154,860 p.)

Poczytaj sobie o podziale pamięci na stos i stertę.
W twoim programie tablica jest tworzona na stosie. Na systemie Windows stos ma rozmiar 1MB. A ty próbujesz umieścić tam tablicę o rozmiarze 8GB (milion komórek po 8 bajtów).

Żeby użyć tak dużego bloku pamięci musisz ją zaalokować na stercie przy pomocy operatora new

auto tablica = new int[rozmiar_tablicy];

Aby uniknąć wycieku pamięci zwolnij zaalokowaną pamięć gdy nie będzie już potrzebna operatorem delete

delete [] tablica;

 

komentarz 13 września 2020 przez lujasjeden Użytkownik (860 p.)

hmmm, no zaalokowalem to dynamicznie operatorem new, ale dalej dla testu 

1000000000

nie moge stworzyc tak duzej tablicy

terminate called after throwing an instance of 'std::bad_array_new_length'
  what():  std::bad_array_new_length

lub jak wpisze ten numer w talice zamiast n to dostaje:

error: size of array is too large|

kod: zamiast long longow jak sa inty to tez nie dziala,

#include <iostream>

using namespace std;

int main()
{
long long n;
cin>>n;
long long *dp;
dp=new long long [n];
dp[0]=0;
for (long long i=1; i<n; i++)
    dp[i]=n+1;
int coins[5]={1,5,10,20,100};
for (long long i=1; i<=n; i++)
    for (int j:coins)
        if (i<j)
            continue;
        else
            dp[i]=min(dp[i], dp[i-j]+1);
cout<<dp[n];
delete [] dp;
}

 

komentarz 13 września 2020 przez NewEraOfPeace Gaduła (4,790 p.)
edycja 13 września 2020 przez NewEraOfPeace

Stawiam, że jest tam x86. Na x86 VAS ma 2/3GB, a więc więcej nie zaalokujesz (chyba, że o czymś nie wiem?)

komentarz 13 września 2020 przez lujasjeden Użytkownik (860 p.)

https://codeforces.com/problemset/problem/472/A

tak samo ten problem, mam taki kod:

#include <iostream>

using namespace std;

int main()
{
int n;
cin>>n;
int c[n];
bool k=false;
for (int i=1; i<=n; i++)
    c[i]=0;
for (int i=1; i<=n; i++)
    for (int j=1; j<=n/2; j++)
        if (i%j==0 && i!=j) c[i]++;
for (int i=1; i<=n; i++)
{
    for (int j=1; j<=n; j++)
    {
        if (c[i]>=2 && c[j]>=2 && i+j==n && k==false)
        {
            cout<<i<<" "<<j;
            k=true;
        }
    }
}
}

to dla testu : 

1000000

tez mi nie dziala, a jakies 12 czy 15 to wszystko smiga ladnie no i probowalem zaalokowac dynamicznie to tak samo

Podobne pytania

0 głosów
1 odpowiedź 147 wizyt
pytanie zadane 20 kwietnia 2023 w PHP przez asqard Nowicjusz (180 p.)
0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 8 marca 2018 w Java przez Kamil Krzysztof Użytkownik (660 p.)
0 głosów
1 odpowiedź 270 wizyt
pytanie zadane 7 grudnia 2022 w C i C++ przez Janchess Początkujący (480 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...