Submission #781084

#TimeUsernameProblemLanguageResultExecution timeMemory
781084sushikidBank (IZhO14_bank)Java
100 / 100
330 ms40832 KiB
import java.util.*;
import java.io.*;

public class bank {
    public static void main(String[] args) throws IOException{
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(System.out);
        StringTokenizer st = new StringTokenizer(r.readLine());
        int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken());
        int[] salarys = new int[n];
        int[] banknotes=  new int[m];
        st = new StringTokenizer(r.readLine());
        for (int i = 0; i < n; i++) {
            salarys[i] = Integer.parseInt(st.nextToken());
        }
        st = new StringTokenizer(r.readLine());
        for (int i = 0; i < m; i++) {
            banknotes[i] = Integer.parseInt(st.nextToken());
        }
        int[][] dp = new int[1 << m][2]; //[cur i you're trying to complete, cur sum]
        for (int i = 1; i < (1 << m); i++) {
            int max_idx = 0;
            int sum = 0;
            for (int j = 0; j < m; j++) {
                if((i & (1 << j)) != 0){
                    int idx = i - (1 << j);
                    int temp_idx = dp[idx][0];
                    int temp_sum = dp[idx][1];
                    if(dp[idx][1] + banknotes[j] < salarys[dp[idx][0]]){
                        temp_sum += banknotes[j];
                    }
                    else if(dp[idx][1] + banknotes[j] == salarys[dp[idx][0]]){
                        temp_idx ++;
                        temp_sum = 0;
                    }
                    else{
                        continue;
                    }
                    if(max_idx < temp_idx){
                        max_idx = temp_idx;
                        sum = temp_sum;
                    }
                    else if(max_idx == temp_idx){
                        sum = temp_sum;
                    }
                }
            }
            dp[i][0] = max_idx;
            dp[i][1] = sum;
            if(max_idx == n){
                pw.println("YES");
                pw.close();
                return;
            }
        }
        pw.println("NO");
        pw.close();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...