Cod sursa(job #964665)
///folosim dinamica "inainte"
#include <fstream>
#include <cstring>
#define In "zegubil.in"
#define Out "zegubil.out"
using namespace std;
ifstream f(In);
ofstream g(Out);
int N, G;
int dp[1<<17], cap[1<<17],A[17];
///dp[i] = numarul minim de ca camioane cu care trebuie
///transportate obiectele cu indicii bitilor de 1 din reprezentarea binara a lui i
///cap[i] = capacitatea ramasa in ultimul camion caracteristica configuratiei i
inline void Read()
{
f>>N>>G;
for(int i = 0 ;i < N; ++i)
f>>A[i];
}
inline void Solve()
{
int conf, nr, r,i, _max = (1<<N), Next;
for(conf = 1;conf< _max; ++conf)
dp[conf] = N+1;
dp[0] = 0;
for(conf = 0;conf< _max; ++conf)
for(i = 0;i < N ; ++i)
if(((conf&(1<<i))==0))
{
if(cap[conf] >= A[i])
{
nr = dp[conf];
r = cap[conf]-A[i];
}
else
{
nr = dp[conf]+1;
r = G - A[i];
}
Next = conf+(1<<i);
if(dp[Next]>nr)
{
dp[Next] = nr;
cap[Next] = r;
}
else
if(dp[Next] == nr && cap[Next]<r)
cap[Next] = r;
}
g<<dp[_max-1]<<"\n";
}
int main()
{
for(int T = 3 ;T ;T--)
{
Read();
Solve();
}
g.close();
return 0;
}