Pagini recente » Cod sursa (job #1809738) | Cod sursa (job #3036637) | Istoria paginii preoni-2004/clasament-11-12 | Cod sursa (job #533969) | Cod sursa (job #3191098)
#include <bits/stdc++.h>
#pragma GCC optimize ("O1")
#pragma GCC optimize ("O2")
#pragma GCC optimize ("O3")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target ("avx2")
using namespace std;
const long long max_size = 20, max_c = (1 << 17) + 20, INF = 1e18 + 1;
pair <int, long long> dp[max_c];
/// first - numaru de camioane minim pt conf, second - restu minim pt nr min camioane
long long v[max_c];
void solve ()
{
long long n, w;
cin >> n >> w;
for (long long i = 1; i <= n; i++)
{
cin >> v[i];
}
for (long long i = 1; i < (1 << n); i++)
{
dp[i].first = n + 1;
}
dp[0].first = 1;
for (long long i = 0; i < (1 << n); i++)
{
for (long long j = 0; j < n; j++)
{
if ((i & (1 << j)) != 0)
{
continue;
}
long long ct = dp[i].first, val = dp[i].second + v[j + 1];
if (val > w)
{
val = v[j + 1];
ct++;
}
int newconf = (i ^ (1 << j));
if (dp[newconf].first > ct)
{
dp[newconf] = {ct, val};
}
else
{
if (dp[newconf].first == ct && val < dp[newconf].second)
{
dp[newconf].second = val;
}
}
}
}
cout << dp[(1 << n) - 1].first;
cout << '\n';
}
signed main ()
{
#ifdef LOCAL
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#else
freopen("zebunghil.in", "r", stdin);
freopen("zebunghil.out", "w", stdout);
#endif // LOCAL
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
long long t;
//cin >> t;
t = 3;
while (t--)
{
solve();
}
return 0;
}