题解 | #购物单#抄大佬代码,写点注释

购物单

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

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();
        int m=sc.nextInt();
        //前m个物品塞满容量为N的背包的最大总和
        int[][] dp=new int[m+1][N+1];
        int[][] price=new int[m+1][3];
        int[][] imp=new int[m+1][3];
        for(int i=1;i<=m;i++){
            int v=sc.nextInt();
            int p=sc.nextInt();
            int q=sc.nextInt();
            //主件
            if(q==0){
                price[i][0]=v;
                imp[i][0]=p;
            }
            else{
                //附件1
                if(price[q][1]==0){
                    price[q][1]=v;
                    imp[q][1]=p;
                }
                //附件2
                else{
                    price[q][2]=v;
                    imp[q][2]=p;
                }
            }
        }
        for(int i=1;i<=m;i++){
            //填满容量为N的背包
            for(int j=1;j<=N;j++){
                if(price[i][0]==0){
                    dp[i][j]=dp[i-1][j];
                }
                else{//第i个物品的价格超过背包容量j,此时不将物品放进背包
                    if(price[i][0]>j){
                        dp[i][j]=dp[i-1][j];
                    }
                    else{//取将第i个物品放进背包的总和与不将第i个物品放进背包的总和的最大值
                        dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-price[i][0]]+price[i][0]*imp[i][0]);
                        //主件和附件1的价格之和小于当前背包容量时,取将第i个物品放进背包的总和与不将第i个物品放进背包的总和的最大值
                        if(price[i][0]+price[i][1]<=j){
                            dp[i][j]=Math.max(dp[i][j],dp[i-1][j-price[i][0]-price[i][1]]+price[i][0]*imp[i][0]+price[i][1]*imp[i][1]);
                        }
                         //主件和附件2的价格之和小于当前背包容量时,取将第i个物品放进背包的总和与不将第i个物品放进背包的总和的最大值
                        if(price[i][0]+price[i][2]<=j){
                            dp[i][j]=Math.max(dp[i][j],dp[i-1][j-price[i][0]-price[i][2]]+price[i][0]*imp[i][0]+price[i][2]*imp[i][2]);
                        }
                         //主件,附件1以及附件2放进背包的价格之和小于当前背包容量时,取将第i个物品放进背包的总和与不将第i个物品放进背包的总和的最大值
                        if(price[i][0]+price[i][1]+price[i][2]<=j){
                            dp[i][j]=Math.max(dp[i][j],dp[i-1][j-price[i][0]-price[i][1]-price[i][2]]+price[i][0]*imp[i][0]+price[i][1]*imp[i][1]+price[i][2]*imp[i][2]);
                        }
                    }
                }
            }
        }
        System.out.println(dp[m][N]);
    }
}
全部评论

相关推荐

11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务