Mai intai trebuie sa te autentifici.
Cod sursa(job #196880)
| Utilizator | Data | 29 iunie 2008 19:53:28 | |
|---|---|---|---|
| Problema | Zebughil | Scor | 50 |
| Compilator | cpp | Status | done |
| Runda | Arhiva de probleme | Marime | 1.34 kb |
#include <cstdio>
const int maxn = 20;
FILE *in = fopen("zebughil.in","r"), *out = fopen("zebughil.out","w");
int n, g;
int a[maxn];
int s[maxn];
int min;
int nrcam;
int kk;
int v[maxn];
void swap(int x, int y)
{
int t = v[x];
v[x] = v[y];
v[y] = t;
}
void readcase()
{
fscanf(in, "%d %d", &n, &g);
for ( int i = 1; i <= n; ++i )
fscanf(in, "%d", &a[i]), v[i] = i;
kk = n;
}
int nrit;
void back(int k)
{
if ( nrit > 20000000 )
return;
if ( nrcam > min )
return;
if ( k > n )
{
if ( nrcam < min )
min = nrcam;
return;
}
for ( int i = 1; i <= kk; ++i )
{
++nrit;
if ( a[ v[i] ] + s[k-1] <= g )
{
s[k] = s[k-1] + a[ v[i] ];
swap(i, kk);
--kk;
back(k+1);
++kk;
}
else
{
++nrcam;
s[k] = a[ v[i] ];
swap(i, kk);
--kk;
back(k+1);
++kk;
--nrcam;
}
}
}
int main()
{
for ( int i = 0; i < 3; ++i )
{
readcase();
nrit = 0;
min = 1 << 30;
nrcam = 1;
back(1);
fprintf(out, "%d\n", min);
}
return 0;
}
