Pagini recente » Cod sursa (job #76526) | Cod sursa (job #1883243) | Cod sursa (job #2546428) | Borderou de evaluare (job #940147) | Cod sursa (job #2121616)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("zebughil.in");
ofstream cout ("zebughil.out");
const int INF = 1e9;
void Init (int cur, int n, int cur_mask, int cur_sum, int g,
vector < int > &weight, vector < int > &dp) {
if (cur > n) {
dp[cur_mask] = 1;
return;
}
if (1ll * cur_sum + weight[cur] <= 1ll * g) {
Init (cur + 1, n, (cur_mask ^ (1 << (cur - 1))), cur_sum + weight[cur], g, weight, dp);
}
Init (cur + 1, n, cur_mask, cur_sum, g, weight, dp);
}
int Solve (int cur_mask, vector < int > &dp) {
int aux = cur_mask, comp;
while (aux) {
aux = ((aux - 1) & cur_mask);
comp = (cur_mask ^ aux);
if (comp > aux) {
break;
}
if (dp[aux] == INF) {
dp[aux] = Solve (aux, dp);
}
if (dp[comp] == INF) {
dp[comp] = Solve (comp, dp);
}
dp[cur_mask] = min (dp[cur_mask], dp[aux] + dp[comp]);
}
return dp[cur_mask];
}
int main () {
int n, g, t = 3;
vector < int > weight (18);
vector < int > dp ((1 << 17) + 1);
while (t --) {
fill (dp.begin (), dp.end (), INF);
cin >> n >> g;
for (int i = 1; i <= n; ++ i) {
cin >> weight[i];
}
Init (1, n, 0, 0, g, weight, dp);
dp[0] = 0;
cout << Solve ((1 << n) - 1, dp) << '\n';
}
}