题解 | #【模板】01背包#

【模板】01背包

http://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e

import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int n = in.nextInt(); int V = in.nextInt();

    int[] v = new int[n+1];
    int[] w = new int[n+1];
    int[][] dp = new int[n+1][V+1];
    for(int i = 0;i< n;i++){
        v[i+1] = in.nextInt();
        w[i+1] = in.nextInt();
    }
    for(int i = 1;i<= n;i++){
        for(int j = 1;j <= V;j++){
            if(v[i] > j)dp[i][j] = dp[i-1][j];
            else{
                dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
            }
        }
    }
        System.out.println(dp[n][V]);
     int[] dp2=new int[V+1];
    Arrays.fill(dp2,Integer.MIN_VALUE);
    //没有物品时,价值为0
    dp2[0]=0;
    for(int i=1;i<=n;i++){
        //由于每个物品只能用一次,为了防止重复计算,需要倒序遍历
        for(int j=V;j>=v[i];j--){
            //状态转移,要么选择第i件物品,要么不选,取价值最大的
            dp2[j]=Math.max(dp2[j-v[i]]+w[i],dp2[j]);
        }
    }
    //如果小于0,说明不能从初始状态转移过来,无解
    if(dp2[V]<0){
        dp2[V]=0;
    }
    System.out.println(dp2[V]);
}

}

全部评论
把j的循环反转就是下一题完全背包的答案
点赞 回复 分享
发布于 2023-12-28 17:08 安徽

相关推荐

不愿透露姓名的神秘牛友
06-25 19:15
点赞 评论 收藏
分享
06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
06-11 13:34
门头沟学院 C++
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务