import java.util.*; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); int n = input.nextInt();//物品数量 int v = input.nextInt();//背包容量 int[] vol = new int[n + 1]; //体积 int[] val = new int[n + 1]; //价值 for (int i = 0; i < n; i++) { vol[i + 1] = input.nextInt(); val[i + 1] = input.nextInt(); } int[] dp = new int[v+1]; for(int i = 1; i <= n; i++){ for(int j = 1; j <= v; j++){ if(j >= vol[i]){ //无限背包和01背包基本类似,区别就在于物品是否唯一, //如果物品唯一,就从后向前填,这样每次值的更新都是基于没放该物品的情况,相当于只放了一件 //如果物品不唯一,就从前向后填,这样如果容量足以放重复的物品时,会基于前面放过的情况累加,相当于放了多件 dp[j] = Math.max(dp[j], dp[j - vol[i]] + val[i]); } } } System.out.println(dp[v]); Arrays.fill(dp,Integer.MIN_VALUE); dp[0] = 0; for(int i = 1; i <= n; i++){ for(int j = 1; j <= v; j++){ if(j >= vol[i]){ dp[j] = Math.max(dp[j], dp[j - vol[i]] + val[i]); } } } if(dp[v]<0){ dp[v] = 0; } System.out.println(dp[v]); } }