java程序练习-B-流放之路

流放之路

描述
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 --; } } }

你可能感兴趣的:(java程序练习-B-流放之路)