题解 | #购物单#

购物单

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

##1.这是一个背包问题的变体; ##2.明确购物规则: 只能在购买主件的前提下购买附件,因此将物品分为两类,主件类和从属类; ##3.状态dp[i][value]表示当前第i个主件的能获得的最大期望值; ##4.选择(遍历所有主件):不购买主件i,购买主件i(0附件),购买主件i+任一附件,购买主件i+两个附件

import java.util.*;

public class Main{
    public static void main(String[] args){
      //输入
        Scanner in=new Scanner(System.in);
      //总金额
      	int money=in.nextInt();
      //物件数
      	int num=in.nextInt();
      //记录主件的附件 addition[i][0]表示主件i的第一个附件
      	int[][] addtion=new int[num+1][num+1];
       //价格和权重
      	int[] w=new int[num+1];
        int[] v=new int[num+1];
      //记录主件
        ArrayList<Integer> major=new ArrayList<>();
      //从1开始
        major.add(0);
        for(int i=1;i<=num;i++){
            int a=in.nextInt();
            int b=in.nextInt();
            int c=in.nextInt();
            v[i]=a/10;w[i]=b;
            if(c!=0){
                int index=0;
                while(addtion[c][index]!=0)
                    index++;
                addtion[c][index]=i;
            }else{
                major.add(i);
            }
        }
      //除以10是因为金额太大了+金额都是10 的倍数
        int[][] dp=new int[major.size()][money/10+1];
      //遍历主件
        for(int i=1;i<major.size();i++){
            int index=major.get(i);
            for(int value=1;value<=money/10;value++){
        //开始选择
                dp[i][value]=dp[i-1][value];
                if(value>=v[index])
                    dp[i][value]=Math.max(dp[i-1][value], dp[i-1][value-v[index]]+v[index]*w[index]);
                if(addtion[index][0]!=0&&value>=v[index]+v[addtion[index][0]])
                    dp[i][value]=Math.max(dp[i][value],dp[i-1][value-v[index]-v[addtion[index][0]]]+
                    v[index]*w[index]+v[addtion[index][0]]*w[addtion[index][0]]);
                if(addtion[index][1]!=0&&value>=v[index]+v[addtion[index][1]])
                    dp[i][value]=Math.max(dp[i][value],dp[i-1][value-v[index]-v[addtion[index][1]]]+
                    v[index]*w[index]+v[addtion[index][1]]*w[addtion[index][1]]);
                if(addtion[index][0]!=0&&addtion[index][1]!=0&&value>=v[index]+v[addtion[index][0]]+v[addtion[index][1]])
                    dp[i][value]=Math.max(dp[i][value],dp[i-1][value-v[index]-v[addtion[index][0]]-v[addtion[index][1]]]+v[index]*w[index]+v[addtion[index][1]]*w[addtion[index][1]]+v[addtion[index][0]]*w[addtion[index][0]]);
            }
        }
      //输出结果
        System.out.println(dp[major.size()-1][money/10]*10);
    }
}
全部评论

相关推荐

之前自己不懂事,投了字节,基本是自己第一次面试,一面就挂了
观水:前几天有个学化学的做前端,加上实习面了22次字节最后成功了
点赞 评论 收藏
分享
程序员小白条:这还能没面试?不过简历确实不像国内写的简历
点赞 评论 收藏
分享
01-14 10:23
已编辑
湖南师范大学 计调
太久没更新,前几天看到一条评论,说“牛客就是当年那群做题区毕业了开始找工作还收不住那股味”的群体。字里行间透着居高临下的评判,不是,他该不会以为自己很幽默?很犀利吧?作为在牛客混了不算短日子的用户,我感到的不只是被冒犯,更是一种深刻的悲哀——这种以“松弛感”为名,对另一种生存策略的轻蔑,颇有一种自己考不上大学早早出来混社会,嘲笑考上大学的人是书呆子,然后大言不惭地说:死读书有什么用,人脉和资源才是硬道理。我不知道说这个话的人,手头究竟握着多少真正管用的人脉与资源,也不知道他这么傲慢地说出“那股味”的时候,是站在哪一个巨人的肩膀上,才能如此“松弛从容”地俯视众生,还能品评出别人身上“没收住”的余...
淬月星辉:这种评论把正常的努力扭曲成卷😂,说白了就是自己不努力,看着身边努力的人一个个都事业有成了,自己的心里开始不平衡了,就发这种酸言酸语。牛客可以说是我用过那么多平台里社区氛围最好的论坛了,用了大半年了,基本上没见过有人吵架的,都是在互帮互助提建议,帮忙看简历的,帮忙选offer的,帮忙指点学习路线的,分享工作经验和趣事的,我觉得这才是互联网该有的样子。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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