没测试,可能有错,肯定大佬指正。个人觉得不是背包。
有爱:
public static int isAll(int[] n, int[] m, int S){
        int sum = Arrays.stream(n).sum() + S;
        Arrays.sort(m);
        int i = 0;
        while (sum - m[i] > 0) {
            sum -= m[i];
            i++;
        }
        return i;
    }

无爱问题1:

public static boolean isAll(int[] n, int[] m, int S){
        if (n.length > m.length) { return false; }
        Arrays.sort(n); Arrays.sort(m);
        for (int i=0; i<n.length; i++) {
            int need = n[i] - m[i];
            if (need < 0)
            S += need;
        }
        return S >= 0;
    }

无爱问题2:

private static int n[];
    private static int m[];
    private static int S;
    public static int[] isAll(int[] n, int[] m, int S){
        Arrays.sort(n);
        Arrays.sort(m);
        Main.n = n; Main.m = m; Main.S = S;
        int l =0, r = m.length;
        while (l < r)
        {
            int mid = l + r + 1 >> 1;
            if (can(mid)) { l = mid; }
            else { r = mid - 1; }
        }
        int ans = 0;
        for (int i=0; i<l; i++) {
            ans += m[i];
        }
        return new int[] {l, ans};
    }

    private static boolean can(int count) {
        int tmpS = S;
        for (int i = count-1,j = n.length-1; i>=0; i--, j--) {
            if (n[j] < m[i]) {
                tmpS -= (m[i] - n[j]);
            }
            if (tmpS < 0) { return false; }
        }
        return true;
    }