제출 #723490

#제출 시각아이디문제언어결과실행 시간메모리
723490PanosPask은행 (IZhO14_bank)C++14
100 / 100
85 ms8508 KiB
#include <bits/stdc++.h>
#define MAXN 20
#define CHECK_BIT(var, pos) (var & (1<<pos))

using namespace std;

int n, m;

// dp[i]: The maximum prefix of people we can pay with the subset i
int dp[(1<<MAXN)];
// leftovers[i]: How much money is leftovers after paying the dp[i] people
int leftovers[(1<<MAXN)];

int reqs[MAXN + 2];
int notes[MAXN + 2];

int main(void)
{
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++)
        scanf("%d", &reqs[i]);
    for (int i = 0; i < m; i++)
        scanf("%d", &notes[i]);

    memset(dp, -1, sizeof(dp));
    memset(leftovers, -1, sizeof(leftovers));
    dp[0] = 0;
    leftovers[0] = 0;

    for (int s = 0; s < (1<<m); s++) {
        if (dp[s] == -1) 
            continue;
        if (dp[s] == n) {
            printf("YES\n");
            return 0;
        }

        int to_cover = reqs[dp[s]];
        for (int i = 0; i < m; i++) {
            if (CHECK_BIT(s, i))
                continue;
            
            // Use i as the last banknote
            int val = notes[i];
            if (val + leftovers[s] < to_cover) {
                dp[s + (1<<i)] = dp[s];
                leftovers[s + (1<<i)] = leftovers[s] + val;
            }
            else if (val + leftovers[s] == to_cover) {
                dp[s + (1<<i)] = dp[s] + 1;
                leftovers[s + (1<<i)] = 0;
            }
        }
    }

    printf("NO\n");
    return 0;
}

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

bank.cpp: In function 'int main()':
bank.cpp:19:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
bank.cpp:21:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |         scanf("%d", &reqs[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~
bank.cpp:23:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |         scanf("%d", &notes[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...