Pagini recente » Cod sursa (job #2133063) | Cod sursa (job #2655636) | Cod sursa (job #2759797) | Cod sursa (job #426687) | Cod sursa (job #2849522)
#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;
for (int i = 0; i < n; i++)
fin >> a[i];
for (int i = 0; i < (1 << n); i++)
dp[i] = {n, 2e9};
dp[0] = {1, 0};
/// 100, 011
for (int i = 0; i < (1 << n); i++)
for (int k = 0; k < n; k++)
{
if (i + (1 << k) <= (1 << n) && ((i & (1 << k)) == 0))
{
int pos = i + (1 << k);
if (1LL * (dp[i].second + a[k]) <= G)
{
if (dp[pos].first > dp[i].first)
dp[pos] = {dp[i].first, dp[i].second + a[k]};
else if (dp[pos].first == dp[i].first && 1LL * (dp[i].second + a[k]) < dp[pos].second)
dp[pos] = {dp[i].first, dp[i].second + a[k]};
}
else
{
if (dp[pos].first > dp[i].first + 1)
dp[pos] = {dp[i].first + 1, a[k]};
else if (dp[pos].first == dp[i].first + 1 && a[k] < dp[pos].second)
dp[pos] = {dp[i].first + 1, a[k]};
}
}
}
fout << dp[(1 << n) - 1].first << "\n";
}
return 0;
}