import java.util.Scanner;
//这道题的思路其实很简单,将每一个时间间隔看成一个背包,然后对这个小背包使用多重背包算法求解
//其中处理的需要注意的地方就是时间间隔的计算
public class Main {
    public static int n;

    public static long packageItems(int[] W, int[] V, int category) {
        if (category==0) return 0;
        long[] dp = new long[category + 1];
        dp[0] = 0;
        for (int i = 1; i < W.length+1; i++) {
            for (int j = W[i-1]; j <=category; j++) {
                dp[j] = Math.max(dp[j], dp[j - W[i-1]] + V[i-1]);
            }
        }
        return dp[category];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();  
        int m = sc.nextInt();  
        int q = sc.nextInt(); 

        int[] categories= new int[q+1];
        int []arr1=new int[q+2];
        arr1[q+1]=n+1;
        for(int i=1;i<q+1;i++){
            arr1[i]=sc.nextInt();
        }
        for(int i=0;i<categories.length;i++){
            categories[i]=arr1[i+1]-arr1[i]-1;
        }

        int[] W = new int[m];
        int[] V = new int[m];
        for (int i = 0; i < m; i++) {
            int ki = sc.nextInt();
            int si = sc.nextInt();
            W[i] = (int) Math.pow(2, ki);  
            V[i] = si; 
        }

        long sum = 0;
        for (int category : categories) {
            sum += packageItems(W, V, category);  
        }

        System.out.println(sum); 
        sc.close();
    }
}

 

posted on 2025-05-25 22:30  fafrkvit  阅读(6)  评论(0)    收藏  举报