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 @ 2024-06-22 23:05  海山了-  阅读(7)  评论(0)    收藏  举报