제출 #337068

#제출 시각아이디문제언어결과실행 시간메모리
337068boykut은행 (IZhO14_bank)C++14
71 / 100
734 ms492 KiB
#include <bits/stdc++.h>
 
using namespace std;

#define all(a) a.begin(),a.end()

vector < int > vec, a, b, used;
bool flag;

void rec(int sum, int x) {
  if (sum == 0) {
    if (vec.size() == x) {
      sort (b.begin(),b.end());
      //for (int i = 0; i < vec.size(); i++) cout << vec[i] << ' '; cout << '\n';
      do {
        int index = 0;
        bool ok = true;
        for (int i = 0; i < vec.size(); i++) {
          int cnt = vec[i], sum = 0, test = 0;
          while (cnt--) {
            sum += b[index];
            if (sum == a[i])
              test = 1;
            index++;
          }
          if (test == 0)
            ok = false;
        }
        if (ok) flag = 1;
      } while (next_permutation(b.begin(), b.end()));
    }
    return;
  }
  for (int i = (vec.empty()?1:vec.back()); i <= sum; i++) {
    vec.push_back(i);
    rec(sum - i, x);
    vec.pop_back();
  }
}

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  
  if (m < n) {
    cout << "NO\n";
    return 0;
  }
  
  a = vector < int > (n);
  b = vector < int > (m);
  used = vector < int > (m);
  
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  
  for (int i = 0; i < m; i++) {
    cin >> b[i];
  }  
  
  if (n <= 10 && m <= 10) {
    flag = 0;
    rec(m, n);
    flag ? cout << "YES\n" : cout << "NO\n";
  } else {
  
    if (n <= 20 && m <= 20) {
      int cnt = 0;
      
      for (int I = 0; I < n; I++) {
        int ok = 0, mn = -1, mnnum = -1;
        for (int i = 0; i < (1 << m); i++) {
          int sum = 0, num = i, index = m - 1, cnt1 = 0;
          while (num) {
            if ((num & 1) && !used[index]) {
              sum += b[index], cnt1++;
            }
            index--;
            num /= 2;
          }
          
          if (sum == a[I]) {
            if (mn == -1 || cnt1 < mn) {
              mn = cnt1;
              mnnum = i;
            }
          }
          
        }
        if (mn != -1) {
          cnt++;
          int index = m - 1;
          while (mnnum) {
            if ((mnnum & 1) && !used[index]) {
              used[index]  = 1;
            }
            index--;
            mnnum /= 2;
          }
        }
      }
      cnt == n ? cout << "YES\n" : cout << "NO\n";
    }
  }
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

bank.cpp: In function 'void rec(int, int)':
bank.cpp:12:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   12 |     if (vec.size() == x) {
      |         ~~~~~~~~~~~^~~~
bank.cpp:18:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |         for (int i = 0; i < vec.size(); i++) {
      |                         ~~^~~~~~~~~~~~
bank.cpp: In function 'int main()':
bank.cpp:74:13: warning: unused variable 'ok' [-Wunused-variable]
   74 |         int ok = 0, mn = -1, mnnum = -1;
      |             ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...