ACwing01背包问题
前提简介
此次深信服原本应该能AK的但是由于我自己看到了自己的旧题,没记错的话,由于当时不是自己一看就会,只记得有点思路所以不敢做,跑去做了最后一题,导致错失一面,于此重踏上dp之路,那题应该是编辑距离同题,只不过犯了心病吧
https://www.acwing.com/problem/content/2/
ps:下面是01背包的代码,注空间上能优化,较为简单故懒得实现
import java.io.*;
import java.util.*;
public class Main{
public static void main(String []args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s=br.readLine();
String[]ss=s.split(" ");
int n=Integer.parseInt(ss[0]);
int v=Integer.parseInt(ss[1]);
int [][]dp=new int[n+1][v+1];
int []w=new int[n+1];
int []vv=new int[n+1];
for(int i=1;i<=n;i++){
s=br.readLine();
ss=s.split(" ");
vv[i]=Integer.parseInt(ss[0]);
w[i]=Integer.parseInt(ss[1]);
}
//dp[i][j]代表的含义是在i个物品中选择,容量为j的时候能填满的最大价值
//dp能求出最终答案吗?为什么?最终答案为dp[n][v]=Math.max(dp[n-1][v],dp[n-1][v-v[n]]+w[n]);
//也即是考虑了关于最后商品选或不选得到的,所以没有问题,因为我们前面无论dp[n-1][v]还是另一个都是在已选情况的最大价值
//自然能推出最终的最后价值,同理能从dp[0][0]不断推下来得到最终答案
for(int i=1;i<=n;i++){
for(int j=1;j<=v;j++){
dp[i][j]=dp[i-1][j];
if(j>=vv[i]){
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-vv[i]]+w[i]);
}
}
}
System.out.println(dp[n][v]);
}
}

浙公网安备 33010602011771号