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]);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误