Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <stdio.h>
- #include <cstdlib>
- #include <cmath>
- #include <memory.h>
- #include <string>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <map>
- #include <set>
- using namespace std;
- #define ll long long
- FILE *fin = freopen("skyscraper.in", "r", stdin);
- FILE *fout = freopen("skyscraper.out", "w", stdout);
- vector<int> memo[1 << 18];
- pair<ll, int> masks[1 << 18];
- ll c[18];
- int n;
- ll w;
- void get(int mask)
- {
- ll total = 0;
- for (int i = 0; i < n; i++)
- if (mask & (1 << i))
- {
- memo[mask].push_back(i);
- total += c[i];
- }
- masks[mask] = make_pair(total, mask);
- }
- int main()
- {
- scanf("%d%lld", &n, &w);
- for (int i = 0; i < n; i++)
- scanf("%lld", c+i);
- for (int mask = 0; mask < (1 << n); mask++)
- get(mask);
- sort(masks + 1, masks + (1 << n));
- reverse(masks + 1, masks + (1 << n));
- int mask = 0;
- vector<int> ans;
- for (int i = 1; i < (1 << n); i++)
- {
- if (!(masks[i].second & mask) && masks[i].first <= w)
- {
- ans.push_back(masks[i].second);
- mask |= masks[i].second;
- }
- }
- printf("%d\n", ans.size());
- for (int i = 0; i < ans.size(); i++)
- {
- printf("%d", memo[ans[i]].size());
- for (int j = 0; j < memo[ans[i]].size(); j++)
- printf(" %d", memo[ans[i]][j]+1);
- puts("");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement