题解 | #[NOIP2006]金明的预算方案#

[NOIP2006]金明的预算方案

https://ac.nowcoder.com/acm/problem/16671

用Map存储 主键值和物品组更方便理解
AC代码
import java.io.*;
import java.util.*;
class Item{
    int v0,p0;
    public Item(int v0,int p0) {
	this.v0=v0;this.p0 = p0; 
    }
    int v1,p1;
    int v2,p2;
}
public class Main {
    static PrintWriter out = new PrintWriter(System.out);
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static String next() throws Exception{
    while (st == null || !st.hasMoreTokens())
	st = new StringTokenizer(br.readLine());
	return st.nextToken();
    }
    static int nextInt()throws Exception{
	return Integer.parseInt(next());
    }
    static int m,n;
    static long[] dp;
    public static void main(String[] args) throws Exception {
	 m=nextInt(); n= nextInt(); 
	 Map<Integer,Item> items = new HashMap<>();
	 dp = new long[m+1];
	 //输入
	 for(int i = 1;i<=n;i++) {
	   int a =nextInt(); //价值
	   int b = nextInt();//重要度
	   int c = nextInt();//附属
	   if(c==0) 
	   	items.put(i,new Item(a, b));
	   else {
	   	Item it = items.get(c);
	   	if(it.v1==0) {
	   	    it.v1 = a; it.p1=b;
	   	}else {
	   	    it.v2 =a;it.p2=b;
	   	}
	   }
    }
	items.forEach((a,item)->{
    //主键 a  物品item
	for(int j=m;j>=1;j--) {
	  //1.只用主物品
	  if(j>=item.v0) 
	      dp[j] = Long.max(item.p0*item.v0+dp[j-item.v0],dp[j]);
	  //2.主+1
	  if(item.p1!=0&&j>=(item.v0+item.v1)) 
	    dp[j] = Long.max(dp[j],
		     (item.p0*item.v0)+(item.p1*item.v1)+dp[j-(item.v0+item.v1)]);
	  //3.主+2
	  if(item.p2!=0&&j>=(item.v0+item.v2)) 
		dp[j] = Long.max(dp[j],
		    (item.p0*item.v0)+(item.p2*item.v2)+dp[j-(item.v0+item.v2)]);
	  //4.主+1+2
	  if(item.p2!=0&&j>=(item.v0+item.v1+item.v2)) 
		dp[j] = Long.max(dp[j],
		(item.p0*item.v0)+(item.p1*item.v1)+(item.p2*item.v2)+dp[j-(item.v0+item.v1+item.v2)]);
	  }
	});
	  out.println(dp[m]);
	  out.close();
	 }
}


全部评论

相关推荐

拉哥聊校招:1.大厂看中的是计算机基础,项目的深度和思考,以及你对技术栈应用在你的项目的业务的思考,以及高并发(以Java为例嘛,就是JUC的掌握),数据库缓存这些。上述掌握了 也需要很长时间的,而且大部分人掌握的还是八股,但校招来说也是够了~(当然小厂一般看中你的上手能力,也就是所谓的“技术”嘛,能写接口也可以了),至于项目这块,因为大多数人都是烂大街项目嘛,所以你需要对于你写的项目需要体现你的思考才是,这些才是你的亮点所在。(前提是进入面试) 2.因为面试官几乎就是看三个模块,一个是实习经历(包括科研经历,假如有的话),一个是项目经历,一个是技能;三个模块的排序就看你对哪个掌握比较深,哪个更深,更有自信就将该模块放在前面。 3.专业技能你写的熟悉,是否真的熟悉,所谓的熟悉是你应用场景、原理都要很懂才叫熟悉,不然的话你经不住面试官拷打很减分的;或许可以考虑换一个说法。技能这块最好是罗列一下,清晰地按照模块分层写:语言及基础、框架、中间件、计算机基础等;(不过你分层写的不错) 4.项目这块最好按照STAR法则去写,按照按照四个模块,项目描述,项目使用的技术栈,项目难点亮点(可以适当加粗),项目做完的收获这样子。我们都知道大部分同学的项目都是烂大街的,这其实没所谓,哪有那么多同学做高并发的项目呢哈哈,很多大厂里面的员工也只是负责 toB 业务的他们也不知道高并发呀~所以,重点在于你对你写的项目的深度思考,你在面对什么相对复杂的业务时用了啥技术去解决?这个技术是否经过验证?权衡?以及带来的后果是啥,浓缩成一句话,你要把你的项目当成要还原一个现成的app去写最好。你是否准备对项目的难点亮点的问题呢?项目问题你这边虽然都是技术栈堆砌,但是问题不大了,整天看起来还是可以的(这边可以给你简历的项目提一些面试官或许会问的问题或者拓展问题) 5.学历很优秀,完全有可能去大厂的呀,现在是秋招提前批和日常实习的专场了,可以好好准备一下,然后充提前批吧~做一个简介:假如需要模拟面试,可以来滴滴我哈哈,一般两次到三次模拟面试就可以避免踩坑了(再强的面霸第一次面试的时候都是做炮灰的,很多学历很好的同学的第一面往往是大厂面试,做炮灰的几率更大,因为小厂也不傻,不给机会面试,所以我们可以给你一次模拟面试,让你真正掌握面试的重点的技巧,而不只是单单背八股文而已~以及包括项目的亮点和难点辅导),简历辅导也是如此。 6.最后的最后,加油努力,祝你成功、顺利。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务