POJ 2392(DP

题意:有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;

    }

}
View Code

 

你可能感兴趣的:(poj)