二维dp:横向是背包剩余容量,纵向是第几个物品
dp值是能否填到这个容量
简化成一维空间,倒着往前推
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
int V = nextInt();
int n = nextInt();
int[] list = new int[n];
for (int i = 0; i < list.length; i++)
list[i] = nextInt();
boolean[] dp = new boolean[V+1];
dp[0] = true;
for (int i = 0; i < n; i++) {
for (int j = V; j >= 0; j--) {
if(j-list[i] < 0) break;
if(dp[j-list[i]])
dp[j] = true;
}
}
for (int i = V; i >= 0; i--) {
if(dp[i]) {
System.out.println(V-i);
return;
}
}
}
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static int nextInt() throws IOException {
st.nextToken();
return (int)st.nval;
}
static long nextLong() throws IOException {
st.nextToken();
return (long)st.nval;
}
}