Pagini recente » Cod sursa (job #1838870) | Cod sursa (job #2943380) | Cod sursa (job #375715) | Cod sursa (job #2359881) | Cod sursa (job #2849424)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("zebughil.in");
ofstream fout ("zebughil.out");
int n, G;
int a[25];
pair <int, int> dp[132000]; /// dp[i].first = numarul minim de pachete, dp[i].second = suma ultimului camion
/// 1010111
int main()
{
for (int j = 1; j <= 3; j++)
{
fin >> n >> G;
if (n > 1)
{
for (int i = 0; i < n; i++)
fin >> a[i];
for (int i = 0; i < (1 << n); i++)
dp[i] = {2e9, 2e9};
dp[0] = {0, 0};
for (int i = 0; i < (1 << n); i++)
for (int k = 0; k < n; k++)
{
if (i + (1 << k) <= (1 << n))
{
if (1LL * (dp[i].second + a[k]) <= G)
{
if (dp[i + k].first > dp[i].first)
dp[i + k] = {dp[i].first, dp[i].second + a[k]};
else if (dp[i + k].first == dp[i].first && 1LL * (dp[i].second + a[k]) < dp[i + k].second)
dp[i + k] = {dp[i].first, dp[i].second + a[k]};
}
else
{
if (dp[i + k].first > dp[i].first + 1)
dp[i + k] = {dp[i].first + 1, a[k]};
else if (dp[i + k].first == dp[i].first + 1 && a[k] < dp[i + k].second)
dp[i + k] = {dp[i].first + 1, a[k]};
}
}
}
fout << dp[(1 << n) - 1].first << "\n";
}
else fout << "1\n";
}
return 0;
}