01背包,动态规划,dp[x+1],定义未达到i元的最低消费,剩下j元,对于当前物品int[i],价值和花费为int[i],是否购买当前物品分两种情况:
当前价值j不够或者刚好能够购买物品i,买了物品i不能买其他物品了,dp[j]是前i-1件的最小价值,与当前价值作比较;
当前价值j超过了物品i的价值,买了物品i,还能买其他物品。

import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int x = scanner.nextInt();
        int[] ints = new int[n];
        for(int i = 0; i < n; i++){
            ints[i] = scanner.nextInt();
        }
        int[] dp = new int[x + 1]; //dp[i] 达到i元的最低消费
        dp[0] = 0;
        Arrays.fill(dp, 10001);
        for(int i = 0; i < n; i++){
            for(int j = dp.length - 1; j >= 0; j--){
                if(j > ints[i]){
                    dp[j] = Math.min(dp[j], dp[j - ints[i]] + ints[i]);
                }else{
                    dp[j] = Math.min(dp[j], ints[i]);
                }
            }
        }
        System.out.println(dp[x]);
    }
}