Pagini recente » Cod sursa (job #2059926) | Cod sursa (job #2283094) | Cod sursa (job #975842) | Cod sursa (job #3280997) | Cod sursa (job #411232)
Cod sursa(job #411232)
#include<stdio.h>
#include<string.h>
#define put (1<<18)+10
#define maxim(a,b) (a>b ? a : b)
int n,g,v[21];
int d[put][21];
int main ()
{
int con,i,j,k,lim,add;
freopen("zebughil.in","r",stdin);
freopen("zebughil.out","w",stdout);
con=3;
for(;con;con--)
{
scanf("%d%d",&n,&g);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
lim=(1<<n)-1;
memset(d, -1, sizeof(d));
d[0][0] = 0;
for(i=1;i<=lim;i++)
{
for(k = 1; k <= n; k++)
if ((1<<(k-1)) == i)
{
d[i][1] = g-v[k];
break;
}
if (k <= n)
continue;
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{
add=(1<<(k-1));
if(!(i&add))
continue;
// obiectul k il includ intr-un nou trans
if (d[i-add][j-1] != -1)
d[i][j] = maxim(d[i][j], g-v[k]);
// obiectul k il includ in ultimul trans
if (d[i-add][j] >= v[k])
d[i][j] = maxim(d[i][j], d[i-add][j]-v[k]);
}
}
}
for(i=1;i<=n;i++)
if(d[lim][i] != -1)
break;
printf("%d\n", i);
}
return 0;
}