流放之路
描述
Description
Dastan输了赌局,在流放之路上,唯一能够带走的只有机器人R2D2.
Dastan还保存了许多绝地剑术视频,但R2D2的硬盘不够大。所以他不得不把它们转刻到光盘上保存。于是他想尽可能地利用好光盘的每一bit空间,尽可能把光盘刻得满满的。
现在Dastan手头上拿到了一张空白容量为S MB的光盘,他文件夹里有N个电影,每个电影的大小分别为X1、X2、……、XN,单位为MB。
请你帮他编写一个程序,计算到底光盘最大能刻得多满,单位为MB。
输入
Input
第一个数字为T,表示测试数据的组数,T≤10,
接下来的T行的每行第一个数字为1≤S≤10000,表示光盘的空白容量,第二个数字1≤N≤10000,表示电影的个数,随后的N个整数X1、X2、……、XN表示每个电影的大小(1≤X≤10000)。
输出
Output
共T行,每一行包含一个整数,表示该光盘能刻录的最大容量。
样例输入
Sample Input
3
4000 3 100 200 300
450 3 100 200 300
100 3 200 300 400
样例输出
Sample Output
600
400
0
参考代码
import java.util.*;
public class Main {
final public static int CN = 10001;
public static int v[];
public static boolean used[];
public static int N;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int cases = cin.nextInt();
while(cases > 0){
int S = cin.nextInt();
N = cin.nextInt();
used = new boolean[S + 1];
v = new int[N];
for(int i = 0;i < N;++ i){
v[i] = cin.nextInt();
}
used[0] = true;
for(int i = 0;i < N;++ i){
for(int j = S;j >= v[i];-- j){
if(!used[j] && used[j - v[i]]){
used[j] = true;
}
}
}
for(int j = S;j >= 0;-- j){
if(used[j]){
System.out.println(j);
break;
}
}
cases --;
}
}
}