题目来源
比之前的01背包问题多了一个重量,解法还是一样的。
状态转移方程:
dp[i][j][k] = max(dp[i-1][j][k],dp[i-1][j-v[i]][k-m[i])+w[i])
优化成两维
dp[j][k] = max(dp[j][k],dp[j-v[i]][k-m[i])+w[i])
优化后,时间复杂度不变O(NVM),空间复杂度O(VM)
由于0<N≤1000,0<V,M≤100,总的时间复杂度为1000100100=10的七次方,应该是够的。(瞎仿着分析的……)
具体代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int o = sc.nextInt();
int p = sc.nextInt();
int q = sc.nextInt();
int v[] = new int[o+1];
int m[] = new int[o+1];
int w[] = new int[o+1];
for(int i = 1;i <= o;i++){
v[i] = sc.nextInt();
m[i] = sc.nextInt();
w[i] = sc.nextInt();
}
int dp[][] = new int[p+1][q+1];
for(int i = 1;i <= o;i++){
for(int j = p;j>=0;j--){
for(int k = q;k >= 0;k--){
dp[j][k] = dp[j][k];
if(j-v[i] >= 0 && k-m[i] >= 0){
dp[j][k] = Math.max(dp[j][k],dp[j-v[i]][k-m[i]]+w[i]);
}
}
}
}
System.out.println(dp[p][q]);
}
}