题目描述
blablabla
样例
blablabla
算法1
二进制拆分 $O(n^2)$
blablabla
时间复杂度
参考文献
https://zhuanlan.zhihu.com/p/117220404
Java 代码
import java.util.*;
import java.io.*;
public class Main{
private static int N;
private static int V;
private static int[] dp;
private static int[] v;
private static int[] w;
static BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException{
String[] s1 = read.readLine().split("\\s+");
N = Integer.parseInt(s1[0]); // 总物品个数
V = Integer.parseInt(s1[1]); // 总体积
dp = new int[V+1]; // 前N个物品,总体积是V的情况下总价值最大
v = new int[N *11]; // 一个长度为N的数组,第i个元素表示第i个物品的体积;
w = new int[N *11]; // 一个长度为N的数组,第i个元素表示第i个物品的价值;
int cnt = 0;
for (int i=1 ; i <= N ; i++){
// 接下来有 N 行,每行有两个整数:v[i],w[i],用空格隔开,分别表示第i件物品的体积和价值
String[] ss = read.readLine().split("\\s+");
int a = Integer.valueOf(ss[0]);
int b = Integer.valueOf(ss[1]);
int s = Integer.valueOf(ss[2]);
// 二进制拆分
int k = 1;
while(k <= s){
cnt++;
v[cnt] = a * k;
w[cnt] = b * k;
s -= k;
k *= 2;
}
if(s > 0){
cnt++;
v[cnt] = a * s;
w[cnt] = b * s;
}
}
N = cnt;
for(int i = 1; i <= N; i++){
for(int j = V; j >= v[i]; j--){
dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]);
}
}
System.out.println(dp[V]);
}
}
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla