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
原文地址:https://www.cnblogs.com/Cw-trip/p/4584251.html