Informatică, întrebare adresată de StefaniaR, 9 ani în urmă

Buna!! Ma puteti ajuta si pe mine cu problema "Bete" de pe pbinfo.ro, va rog? Imi da doar 30. Asta e sursa pe care am trimis-o
#include<fstream>
using namespace std;
ifstream f("bete.in");
ofstream g("bete.out");
int n, max1,v[101], s, p[10001], k, a[101];
int main ()
{
f>>n>>s;
max1 =0;
k=max1;
p[0]=-1;
for (int i=1;i<=n; ++i)
    f>>v[i];
for (int i=1; i<=n; ++i)
{
     for (int j=max1; j>=0; --j)
{
          if (p[j]!=0 && j+v[i]<=s)
                  p[j+v[i]]=i;
          if (k k=j+v[i];
}
max1 =k;
}
if(p[s]!=0)
{
     g<<"DA\n";
     k=0;
     while (p[s]>=0)
{
       k++;
       a[k]=v[p[s]];
       s-=v[p[s]];
}
g<<k<<'\n';
for (int i=1; i<=k; ++i)
g<<a[i]<<' ';        }
else
g<<"NU\n";
g.close();
return 0;
}


express: Nu se face asa sursa de 100p. Este o probelea de dinamica si se aplica problema rucsacului. Probabil pentru 50 de puncte iti ofer si solutia de 100p de pe pbinfo. Daca tu platesti doar cu 5p pentru o problema de dinamica (chiar daca este cotata ca problema usoara) nu cred ca ti-o va rezolva cineva.
express: M-am uitat mai atent ...chiar incerci sa faci rucsac...daca te mai chinui putin poti scoate 100p. Succes!
StefaniaR: Multumesc de sfta. Sincer nici nu m-am uitat la puncte cand am scris, iar acum nu stiu cum sa dau mai multe, ca as da, nu e asta o problema
express: O scri din nou
StefaniaR: Ok

Răspunsuri la întrebare

Răspuns de express
0
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cassert>
using namespace std;
#define NN 105
#define SS 105*100+10

ifstream fin("bete.in");
ofstream fout("bete.out");

int n, S, B[NN], v[SS], last[SS], smax;

void determinare(int i, int contor)
{
if(i==0)
fout << contor << "\n";
else
{
determinare(i-B[last[i]], contor+1);
fout << last[i] << " ";
}

}

int main(){
assert(fin >> n >> S );
for(int i=1 ; i<=n ; ++i)
assert(fin >> B[i]), assert(B[i]<100), smax += B[i];
if(S > smax)
{
fout << "NU";
return 0;
}

v[0] = 1;
for(int i=1;i<=n;++i)
for(int j=smax ; j>=0 ; --j)
if(v[j] && !v[j+B[i]])
v[j+B[i]] = 1, last[j+B[i]] = i;
//for(int i=0; i<=smax; ++i)
// cout << i << " " << v[i] << " " << last[i] << endl;


if(!v[S])
fout << "NU\n";
else
{
fout << "DA\n";
determinare(S, 0);
}

return 0;
}

Alte întrebări interesante