题目1 : 满减优惠
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
最近天气炎热,小Ho天天宅在家里叫外卖。他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元。并且如果消费总计满X元,还能享受优惠。小Ho是一个不薅羊毛不舒服斯基的人,他希望选择若干道不同的菜品,使得总价在不低于X元的同时尽量低。
你能算出这一餐小Ho最少消费多少元吗?
输入
第一行包含两个整数N和X,(1 <= N <= 20, 1 <= X <= 100)
第二行包含N个整数A1, A2, ..., AN。(1 <= Ai <= 100)
输出
输出最少的消费。如果小Ho把N道菜都买了还不能达到X元的优惠标准,输出-1。
样例输入
10 50 9 9 9 9 9 9 9 9 9 8
样例输出
53
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int X = scanner.nextInt();
int[] input = new int[N + 1];
int total = 0;
for (int i = 1; i < N + 1; i++) {
input[i] = scanner.nextInt();
total += input[i];
}
int bag = total - X;
if (bag < 0) {
System.out.println(-1);
} else {
int[][] dp = new int[bag + 1][N + 1]; // dp[bag][N]
for (int i = 1; i < N + 1; i++) {
for (int j = bag; j >= 0; j--) {
if (j >= input[i])
dp[j][i] = Math.max(dp[j][i - 1], dp[j - input[i]][i - 1] + input[i]);
else
dp[j][i] = dp[j][i - 1];
}
}
System.out.println(total - dp[bag][N]);
}
scanner.close();
}
}