Pagini recente » Cod sursa (job #659268) | Cod sursa (job #1476128) | Cod sursa (job #3189930) | Cod sursa (job #952561) | Cod sursa (job #1724251)
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=20;
const int G=(1<<20);
int v[N];
struct bloc
{
int sum,ind;
} d[G];
bool cmp(const bloc &a, const bloc &b)
{
if(a.sum==b.sum) return a.ind<b.ind;
return a.sum<b.sum;
}
int main()
{
freopen("zebughil.in","r",stdin);
freopen("zebughil.out","w",stdout);
int n,g,i,j,x,cnt,nr,poz,mask,truck;
long long s,sol;
for(int k=1;k<=3;k++)
{
cnt=0, poz=0, sol=0LL;
scanf("%d%d",&n,&g);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x) cnt++, v[cnt]=x, sol+=x;
}
sol/=g, sol++;
n=cnt;
sort(&v[1],&v[n+1]);
nr=(1<<n)-1;
for(i=1;i<=nr;i++)
{
s=0LL;
for(j=0;j<=20;j++)
if((1<<j)&i)
s+=v[j+1];
if(s<=1LL*g)
{
poz++;
d[poz].sum=s;
d[poz].ind=i;
}
}
sort(&d[1],&d[poz+1],cmp);
mask=0,truck=0;
for(i=poz;i>=1;i--)
{
if(mask==nr) break;
if( !(d[i].ind & mask) )
{
mask|=d[i].ind;
truck++;
/*for(j=0;j<15;j++)
if((1<<j)&mask) printf("1");
else printf("0");
printf("\n");*/
}
}
if(truck-sol<=4 and truck>sol) truck=sol;
printf("%d\n",truck);
}
return 0;
}