题目链接
题目描述
求解思路
- 动态规划:
v
表示背包空间,即还有多少价值可以去掉。dp[i][j]
表示前i
本书在总价值不超过j
的情况下所能达到的最大价值。- 状态转移方程:
- d p [ i ] [ j ] = d p [ i − 1 ] [ j ] , ( p r i c e s [ i ] > j ) dp[i][j]=dp[i-1][j], (prices[i]>j) dp[i][j]=dp[i−1][j],(prices[i]>j)
- d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − a [ i ] ] + a [ i ] ) , ( p r i c e s [ i ] ≤ j ) dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]),(prices[i] \leq j) dp[i][j]=max(dp[i−1][j],dp[i−1][j−a[i]]+a[i]),(prices[i]≤j)
实现代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n, x;
n = in.nextInt();
x = in.nextInt();
int[] prices = new int[n + 1];
int sum = 0;
for (int i = 1; i <= n; i++) {
prices[i] = in.nextInt();
sum += prices[i];
}
// 背包空间:表示还有多少价值可以去掉
int v = sum - x;
// dp[i][j]表示前i本书在总价值不超过j的情况下所能达到的最大价值
int[][] dp = new int[n + 1][v + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= v; j ++) {
// 如果第i本书价值已经超过了j,只能选择不放
if (prices[i] > j) {
dp[i][j] = dp[i - 1][j];
} else {
// 否则,选择放入和不放入中大的那个
// 因为这里能达到的值越大,最后能去掉的值就越大
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - prices[i]] + prices[i]);
}
}
}
System.out.println(sum - dp[n][v]);
}
}