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]);
    }
}
posted @   海山了-  阅读(1)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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最大的设计失误
点击右上角即可分享
微信分享提示