| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 90905 | RAkhshon | 은행 (IZhO14_bank) | C++14 | 0 ms | 0 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define st string
#define fr first
#define se second
#define INF 1000000000
using namespace std;
ll m, n,a[101101], b[101101], dp[101101];
void us2(){
    do{
    ll sum = 0, num = 1;
    for(ll i = 1; i <= m; i ++){
        sum=sum+b[i];
        if(num == n + 1) break;
        if(sum > a[num]) break;
        if(sum == a[num]) sum=0,num++;
    }
    if(num == n+1){
        printf("YES");
        break;
    }
    }while(next_permutation(b+1,b+1+m));
    printf("NO");
}
void us1(){
    ll s = a[1];
        for(ll j = 1; j <= m; j ++){
            for(ll i = 1; i <= s; i ++){
                if(i >= b[j] && dp[i] == INF && dp[i-b[j]] != b[j] && dp[i-b[j]]!=INF){
                    dp[i]=b[j];
                }
            }
        }
        if(dp[s] == INF){
            printf("NO");
        }
        else
        {
            printf("YES");
        }
}
int main()
{
    scanf("%lld %lld", &n, &m);
    ll s;
    for(ll i = 1; i <= n; i ++){
        scanf("%lld", &a[i]);
    }
    for(ll i = 1; i <= m; i ++){
        scanf("%lld", &b[i]);
    }
  	for(ll = 1; i <= a[1]; i ++){
      	dp[i]=INF;
    }
    sort(a+1,a+1+n);
    sort(b+1,b+1+m);
    if(n == 1){
        us1();
        return 0;
    }
    else
    if(n <= 10 && m <= 10){
        us2();
        return 0;
    }
    return 0;
}
