Pagini recente » Cod sursa (job #19067) | Cod sursa (job #966316) | Cod sursa (job #1642580) | Cod sursa (job #501784) | Cod sursa (job #3265604)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("zebughil.in");
ofstream g ("zebughil.out");
const int NMAX = 17, INF = 1e9;
int v[NMAX];
int dp[1 << NMAX];
int rem[1 << NMAX];
int main()
{
//ios_base :: sync_with_stdio(false);
//cin.tie(NULL);
int tt = 3;
while(tt --)
{
int n, G;
f >> n >> G;
for(int i = 0; i < n; i ++)
{
f >> v[i];
}
dp[0] = rem[0] = 0;
for(int mask = 1; mask < (1 << n); mask ++) dp[mask] = rem[mask] = INF;
for(int mask = 0; mask < (1 << n); mask ++)
{
for(int i = 0; i < n; i ++)
{
if((mask & (1 << i)) == 0)
{
int aux = dp[mask] + (rem[mask] + v[i] > G);
if(aux < dp[mask + (1 << i)])
{
dp[mask + (1 << i)] = aux;
if(rem[mask] + v[i] > G) rem[mask + (1 << i)] = rem[mask] + v[i] - G;
else rem[mask + (1 << i)] = rem[mask] + v[i];
}
else if(aux == dp[mask + (1 << i)])
{
aux = rem[mask] + v[i];
if(aux > G) aux -= G;
rem[mask + (1 << i)] = min(rem[mask + (1 << i)], aux);
}
}
}
}
g << (dp[(1 << n) - 1] + (rem[(1 << n) - 1] ? 1 : 0)) << '\n';
}
return 0;
}