Submission #1264640

#TimeUsernameProblemLanguageResultExecution timeMemory
1264640piolkBank (IZhO14_bank)C++20
0 / 100
1094 ms8520 KiB
#include <bits/stdc++.h> using namespace std; int main(){ //my first bitmask dp int n,m; cin>>n>>m; vector<int> salaries(n); vector<int> banknotes(m); for (int i=0;i<n;i++) cin>>salaries[i]; for (int i=0;i<m;i++) cin>>banknotes[i]; int subsets=(1<<m); vector<int> subsetSum(subsets,0); subsetSum[0]=0; for (int mask=1;mask<subsets;mask++){ int lowestBit=mask & -mask; int j=0; //the number of the smallest bit while (lowestBit!=(1<<j)) j++; subsetSum[mask]=subsetSum[mask ^ lowestBit]+banknotes[j]; } vector<int> paid(subsets,0); // paid[subset] - what prefix of salaries was paid with subset paid[0]=0; for (int mask=0;mask<subsets;mask++){ int next=paid[mask]; //next salary int av=(subsets-1) ^ mask; //the banknotes avaible after using subset mask banknotes for (int sub=av;sub>0;sub=(sub-1)&av){ if (subsetSum[sub]==salaries[next]){ //we can pay the next salary int newMask=mask|sub; //after spending sub banknotes to pay paid[newMask]=next+1; } } } if (paid[subsets-1]==n) cout<<"YES"; else cout<<"NO"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...