问题描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式
第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
输出格式
一个整数,表示箱子剩余空间。
样例输入
24
6
8
3
12
7
9
7
样例输出
0
思路:
这题就是背包问题(动态对话),求出最大能装下的体积,让V减去他,就是我们需要的答案,代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner read = new Scanner(System.in);
int max = read.nextInt();
int n = read.nextInt();
int volume[] = new int[n+1];
for(int i=1;i<=n;i++)
{
volume[i] = read.nextInt();
}
read.close();
int num[][] = new int[n+1][max+1];
for(int i=1;i<=n;i++)//遍历所有物品
{
for(int j=1;j<=max;j++)
{
if(j>=volume[i])
{
num[i][j] = Math.max(num[i-1][j], num[i-1][j-volume[i]]+volume[i]);
}
else
{
num[i][j] = num[i-1][j];
}
}
}
System.out.println(max-num[n][max]);
}
}