Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- see#include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace std;
- using namespace __gnu_pbds;
- #define ll long long
- #define nl "\n"
- #define mod 1'000'000'007
- #define cin(v) for (auto &i : v) cin >> i;
- #define cin2d(grid, n, m) for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) cin >> grid[i][j];
- #define cout(v) for (auto &i : v) cout << i << " ";cout << '\n';
- #define cout2d(grid, n, m) for(int i = 0; i < n; i++, cout << nl) for(int j = 0; j < m && cout << grid[i][j]; j++)
- #define all(v) v.begin(), v.end()
- #define rall(v) v.rbegin(),v.rend()
- #define fixed(n) fixed << setprecision(n)
- #define ceil(n, m) (((n) / (m)) + ((n) % (m) ? 1 : 0))
- #define ordered_set tree <int, null_type, greater_equal<int>, rb_tree_tag, tree_order_statistics_node_update>
- void SicParvisMagna()
- {
- ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
- #endif
- }
- struct box{
- int time, num, mask;
- };
- int n, m;
- vector<box>v;
- vector<vector<int>>dp;
- int FindMin(int idx, int mask){
- if(mask == (1 << n) - 1)
- return 0;
- if(idx == m) return 1e9;
- int& ret = dp[idx][mask];
- if(~ret) return ret;
- ret = min(FindMin(idx + 1, mask), v[idx].time + FindMin(idx + 1, mask | v[idx].mask));
- return ret;
- }
- void solve()
- {
- cin >> n >> m, v.resize(m), dp.assign(m, vector<int>((1 << n), -1));
- vector<int>temp;
- for(int i = 0; i < m && cin >> v[i].time >> v[i].num; i++){
- int mask = 0;
- for(int j = 0, x; j < v[i].num && cin >> x; j++)
- mask |= (1 << (x - 1));
- v[i].mask = mask;
- }
- int ans = FindMin(0, 0);
- cout << (ans >= 1e9 ? -1 : ans) << nl;
- }
- int main()
- {
- SicParvisMagna();
- int t = 1;
- // cin >> t;
- while(t--)
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement