题意理解
这题只要把价格乘以重要度,就变成了01背包。然后01背包是有套路的。
代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, m;
static final int maxn = 40;
static int[] v = new int[maxn];
static int[] w = new int[maxn];
static int[][] dp = new int[maxn][30010];
public static void main(String[] args) {
FastScanner fs = new FastScanner();
N = fs.nextInt();
m = fs.nextInt();
for(int i = 1; i <= m; i++) {
v[i] = fs.nextInt();
w[i] = fs.nextInt();
w[i] *= v[i];
}
for(int i = 0; i < m + 1; i++) {
for(int j = 0; j < N + 1; j++) {
dp[i][j] = 0;
}
}
int max = -1;
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= N; j++) {
if(j >= v[i]) {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-v[i]] + w[i]);
} else {
dp[i][j] = dp[i - 1][j];
}
if(dp[i][j] > max) {
max = dp[i][j];
}
}
}
System.out.println(max);
}
public static class FastScanner {
private BufferedReader br;
private StringTokenizer st;
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public String nextToken() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (Exception e) {
// TODO: handle exception
}
}
return st.nextToken();
}
public int nextInt() {
return Integer.valueOf(nextToken());
}
}
}