题意:有K个积木,每个给出块数,高度和这种块不能超过的最大高度,问最高能垒多高。
经历了强行转换语言的阵痛啊。。。。java自定义排序不会写,然后又mle了,让我开始怀疑java的性能(其实只是因为脑残没写滚动数组。。。。)
经典的多重背包,状态是前i种垒到j高时能剩下的第i种块的数目。
import java.util.*; import java.math.*; import java.io.*; public class Main { public static final int maxv=2000+40; public static void main(String[] args) throws Exception { Scanner in = new Scanner(new File("/home/develop/eclipse_file/ACMproject/src/in")); // Scanner in=new Scanner(System.in); int K=in.nextInt(); bl[] sc=new bl[K]; for(int i=0;i<K;i++){ sc[i]=new bl(); sc[i].h=in.nextInt(); sc[i].a=in.nextInt(); sc[i].c=in.nextInt(); } Arrays.sort(sc); int[] dp1=new int[40001]; int[] dp2=new int[40001]; int[] swap; for(int j=0;j<40001;j++) dp1[j]=-1; dp1[0]=0; for(int i=1;i<=K;i++){ for(int j=0;j<40001;j++){ if(dp1[j]>=0){ dp2[j]=sc[i-1].c; }else if(j-sc[i-1].h>=0&&dp2[j-sc[i-1].h]>0&&j<=sc[i-1].a){ dp2[j]=dp2[j-sc[i-1].h]-1; }else{ dp2[j]=-1; } } swap=dp1; dp1=dp2; dp2=swap; } int ans=0; for(int i=0;i<=40000;i++){ if(dp1[i]>=0) ans=i; } System.out.println(ans); in.close(); } } class bl implements Comparable<bl> { int h,a,c; @Override public int compareTo(bl a){ return this.a-a.a; } }
时间: 2024-10-27 07:06:11