Pagini recente » Cod sursa (job #1548413) | Cod sursa (job #1222983) | Cod sursa (job #2230532) | Cod sursa (job #1010565) | Cod sursa (job #397037)
Cod sursa(job #397037)
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int n,g,sol,v[20],viz[20];
void sol2()
{
memset(viz,0,sizeof(viz));
int i,j,lim=(1<<n)-1,cg,ci,csol=0,min;
while(viz[0]<n)
{
min=g;
for(i=1;i<=lim;i++)
{
cg=g;
for(j=0;j<n;j++)
if(i&(1<<j))
if(viz[j+1])
break;
if(j<n)
continue;
for(j=0;j<n;j++)
if(i&(1<<j))
cg-=v[j+1];
if(cg>=0)
if(cg<=min)
{
min=cg;
ci=i;
}
}
for(i=0;i<n;i++)
if(ci&(1<<i))
{
viz[i+1]=1;
viz[0]++;
}
csol++;
}
if(csol<sol)
sol=csol;
}
int main()
{
freopen("zebughil.in","r",stdin);
freopen("zebughil.out","w",stdout);
int i,j,lim,min,cj,ci,t=3,cg;
while(t--)
{
memset(viz,0,sizeof(viz));
sol=0;
scanf("%d%d",&n,&g);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
sort(v+1,v+n+1);
while(viz[0]<n)
{
for(i=n;i>=1;i--)
if(!viz[i])
break;
ci=i;
cj=0;
viz[ci]=1;
viz[0]++;
min=g;
lim=(1<<ci)-1;
for(j=0;j<=lim;j++)
{
cg=g-v[i];
for(i=0;i<ci;i++)
if(j&(1<<i))
if(viz[i+1])
break;
if(i<ci)
continue;
for(i=0;i<ci;i++)
if(j&(1<<i))
cg-=v[i+1];
if(cg>=0)
if(cg<=min)
{
min=cg;
cj=j;
}
}
sol++;
for(j=0;j<ci;j++)
if(cj&(1<<j))
{
viz[j+1]=1;
viz[0]++;
}
}
sol2();
printf("%d\n",sol);
}
return 0;
}