# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
90905 | RAkhshon | Bank (IZhO14_bank) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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;
}