背包问题之完全背包

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]);
    }
}
全部评论

相关推荐

2025-12-08 16:04
门头沟学院 Java
本人本科末9,今年大三。大一大二一直玩,什么都没学到,在大学混日子混了两年,每天不是在打农就是在steam。大三开学时一个和自己玩的好的同学去实习了,才发现自己白白浪费了两年的时间,如果真不冲一下就真去京东,阿里,美团送外卖了今年9月份开始学Java,一开始一直跟着黑马视频看,后面发现看视频效率太低了,时间根本不够,就开始主要看文档和看书了。这几个月一直在学,真的尽力了,希望暑期前能找一份好点的实习。我简历上面的项目大多没有指标,但是实际上我是真没多少时间去做项目,我基本主要是动手只做了外卖和天机,黑马点评和12306我都是只是看了项目。主要是自己的时间真的不多,但是这样子自己的代码能力确实比较差。而且自己也没有做过实际的工程,我顶多用jmeter测试一下接口tps啥的,比如使用Redis管道提升了一点性能,减少Redis交互,这种值得写上去吗?需不需要具体到某些数字求求各位佬给一些建议,看看简历怎么优化?项目介绍是不是不够详细?没有具体到业务方面。项目会不会提到大致实现原理导致面试官一看简历就知道怎么实现就没有问的欲望?专业技能一些字段是不是要加粗,是不是写太啰嗦了?有没有必要压缩内容变成一页?两页的话是不是都要把两页填地满满的。
给秋招一个交代:一页简历最好,网上做的项目放面试官眼里都是玩具,简历上不需要强调有什么难点,记住就行防止真的问。然后背八股,多投多面试就行
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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