题目描述
有一个箱子容量为 V(正整数,0 \leq V \leq 20000),同时有0≤V≤20000),同时有n个物品(个物品(0 \leq n \leq 30$),每个物品有一个体积(正整数)。
要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入描述
输入第一行,一个整数,表示箱子容量。
第二行,一个整数 n,表示有 n个物品。
接下来 n 行,分别表示这 n 个物品的各自体积。
输出描述
输出一行,表示箱子剩余空间。
输入输出样例
示例 1
输入
24
6
8
3
12
7
9
7
输出
0
这题就是简单的0/1背包问题,把物体装进箱子使箱子容量最小,也就是要尽可能的多装。
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int V=in.nextInt();
int n=in.nextInt();
int []w=new int[n+1];
for(int i=1;i<=n;i++)
w[i]=in.nextInt();
int [][]dp=new int[n+1][V+1];
for(int i=1;i<=n;i++)
for(int j=1;j<=V;j++) {
if(w[i]>j)//当第i个物体装不进箱子时继承i-1个物体的重量
dp[i][j]=dp[i-1][j];
else {//当可以装进去时,则判断装还是不装
dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-w[i]]+w[i]);
}
}
System.out.print(V-dp[n][V]);
}
}
|