题解 | #【模板】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 安徽

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务