背包问题之完全背包

import java.util.Arrays;
import java.util.Scanner;

/**
 * 你有一个背包,最多能容纳的体积是V。
 *
 * 现在有n种物品,每种物品有任意多个,第i种物品的体积为v_i,价值为w_i。
 * (1)求这个背包至多能装多大价值的物品?
 * (2)若背包恰好装满,求至多能装多大价值的物品?
 *
 * 问题解题模版
 * (1)定义一维dp数组,初始化dp[0]=0;
 *    if (题目要求恰好装入背包):{
 * 	      if (求的是最大总价值){
 * 		     初始化为Integer.MIN_VALUE(注意dp[0]=0)
 *        }else if(求的是最小总价值){  //例如Coin Change
 * 		     初始化为Integer.MAX_VALUE
 *        }
 *    }else if(不要求恰好装满背包){
 * 		  初始化为0
 *    }
 *  (2)状态转移
 *  for (int i = 1; i <= V; i++) {  //背包容量
 * 	    for (int j = 0; j < n; j++) { // 正序遍历dp数组(与01背包的差异之处在这里,V是背包容量,v[i]是没见商品的体积)
 * 		    // 如果要求恰好装入,需要if判断,否则不需要用这个判断语句
 * 		    if (i-v[j]>0&&dp[i - v[j]] != Integer.MIN_VALUE或Integer.MAX_VALUE) { //根据目标为最小/最大来选Integer.MIN_VALUE或者Integer.MAX_VALUE
 * 			    dp[i] = max或min(dp[i], dp[i - v[j]] + w[j]); //根据目标为最大/最小来选max/min
 *          }
 *      }
 * }
 */
public class 完全背包 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int V=sc.nextInt();//背包的容量
        int[] v=new int[n];
        int[] w=new int[n];
        for(int i=0;i<n;i++){
            v[i]=sc.nextInt();//物品的体积
            w[i]=sc.nextInt();//物品的价值
        }
        int[] dp1=new int[V+1];//物品的最大价值,但不要求正好装满背包
        for(int i=1;i<=V;i++){
            for(int j=0;j<n;j++){
                if(i-v[j]>=0){
                    dp1[i]=Math.max(dp1[i],dp1[i-v[j]]+w[j]);
                }
            }
        }
        System.out.println(dp1[V]);
        int[] dp2=new int[V+1];//物品的最大价值,要求正好装满背包
        Arrays.fill(dp2,Integer.MIN_VALUE);//最大值这里就赋最小值,并且dp2[0]=0,后面比较用max
        dp2[0]=0;
        for(int i=1;i<=V;i++){ //背包容量或者物品为外循环都可以
            for(int j=0;j<n;j++){ //这里正序遍历
                if(i-v[j]>=0&&dp2[i-v[j]]!=Integer.MIN_VALUE){
                    dp2[i]=Math.max(dp2[i],dp2[i-v[j]]+w[j]);
                }
            }
        }
        System.out.println(dp2[V]<0?0:dp2[V]);
    }
}
全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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