public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 商品数 // 背包大小 int n = sc.nextInt(), m = sc.nextInt(); int[] v = new int[n+1]; int[] w = new int[n+1]; int ans = 0; for(int i = 1; i <= n; i++) { int val = sc.nextInt(); w[i] = sc.nextInt(); if(val < 0) { // 容量为负直接放入 m -= val; // 扩容 v[i] = -val; ans += w[i];// 放入后要在最后加上它的价值 } else { v[i] = val; } } int[] dp = new int[m+1]; for(int i = 1; i <= n; i++) { for(int j = m; j >= v[i]; j--) { dp[j] = Math.max(dp[j],dp[j-v[i]] + w[i]); } } for(int i = 1; i <= m; i++) { dp[m] = Math.max(dp[m],dp[i]); } System.out.println(dp[m] + ans); } }
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(), m =sc.nextInt(); int[] arr = new int[m]; for(int i = 0; i < m; i++) { arr[i] = sc.nextInt(); } int res = 0; for(int i = 1; i < 1 << m; i++) { int t = 1, cnt = 0; for(int j = 0; j < m; j++) { if(((i >> j) & 1) != 0) { long add = get(t,arr[j]); if(add > n) { t = -1; break; } t = (int)add; cnt++; } } if(t != -1) { if(cnt % 2 == 0) res -= n / t; else res += n / t; } } System.out.println(res); } public static long get(int a, int b) { return (long)a * b / gcd(a,b); } public static int gcd(int a, int b) { return b == 0 ? a : gcd(b,a%b); } }