Pagini recente » Cod sursa (job #2968226) | Cod sursa (job #1914098) | Cod sursa (job #1898372) | Monitorul de evaluare | Cod sursa (job #2949989)
#include<bits/stdc++.h>
#define int long long
#define INF 1000000000000000000
using namespace std;
ifstream f("zebughil.in");
ofstream g("zebughil.out");
int n,k,v[19],p[21];
struct elem
{
int nrcam,greutate;
}dp[177];
///dp[mask]=nr minim de camioane atunci cand consideram pietrele marcate cu 1 in stare si pentru acest minim si greutatea minima din ultimul camion
signed main()
{
int i,l,mask;
p[0]=1;
for(i=1;i<=19;i++)
p[i]=p[i-1]*2;
for(l=1;l<=3;l++)
{
f>>n>>k;
for(i=1;i<=n;i++)
f>>v[i];
for(mask=0;mask<=p[n]-1;mask++)
dp[mask].nrcam=dp[mask].greutate=INF;
for(i=1;i<=n;i++)
dp[p[i-1]].nrcam=1,dp[p[i-1]].greutate=v[i];
for(mask=1;mask<=p[n]-1;mask++)
{
for(i=1;i<=n;i++)
{
if((mask&p[i-1])==0)
{
if(dp[mask].greutate+v[i]<=k)
{
if(dp[mask|p[i-1]].nrcam>dp[mask].nrcam)
dp[mask|p[i-1]].greutate=dp[mask].greutate+v[i],dp[mask|p[i-1]].nrcam=dp[mask].nrcam;
else
if(dp[mask|p[i-1]].nrcam==dp[mask].nrcam && dp[mask|p[i-1]].greutate>dp[mask].greutate+v[i])
dp[mask|p[i-1]].greutate=dp[mask].greutate+v[i],dp[mask|p[i-1]].nrcam=dp[mask].nrcam;
}
else
{
if(dp[mask|p[i-1]].nrcam>dp[mask].nrcam+1)
dp[mask|p[i-1]].greutate=v[i],dp[mask|p[i-1]].nrcam=dp[mask].nrcam+1;
else
if(dp[mask|p[i-1]].nrcam==dp[mask].nrcam+1 && dp[mask|p[i-1]].greutate>v[i])
dp[mask|p[i-1]].greutate=v[i],dp[mask|p[i-1]].nrcam=dp[mask].nrcam+1;
}
}
}
}
g<<dp[p[n]-1].nrcam<<'\n';
}
return 0;
}