题解 | #[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 收藏 评论
分享
牛客网
牛客企业服务