多重背包变形--poj2392

来源:互联网 发布:现金流量表数据来源 编辑:程序博客网 时间:2024/04/30 03:36
Language:
Space Elevator
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 7307 Accepted: 3429

Description

The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000). 

Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.

Input

* Line 1: A single integer, K 

* Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.

Output

* Line 1: A single integer H, the maximum height of a tower that can be built

Sample Input

37 40 35 23 82 52 6

Sample Output

48每个物体有自己的高度限制,只需要把上限改为自己的限制即可,要先计算限制小的,也就是要对a进行排序
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct A{    int h,a,c;} cow[405];int dp[400005];int max1,max2;bool com(A c,A b){    return c.a<b.a;}void zero(int hi,int ai){    for(int i=ai; i>=hi; i--)        dp[i]=max(dp[i],dp[i-hi]+hi);}void complete(int hi,int ai){    for(int i=hi; i<=ai; i++)        dp[i]=max(dp[i],dp[i-hi]+hi);}void mult(int cost,int hi,int ai,int ci){    if(hi*ci>=ai)        complete(hi,ai);    else    {        int k=1;        while(k<ci)        {            zero(k*hi,ai);            ci-=k;            k*=2;        }        zero(ci*hi,ai);    }}int main(){    //freopen("in.txt","r",stdin);    int k;    while(cin>>k)    {        //max2=-1;        for(int i=1; i<=k; i++)        {            cin>>cow[i].h>>cow[i].a>>cow[i].c;        }        sort(cow+1,cow+k+1,com);        max1=-1;        memset(dp,0,sizeof(dp));        for(int i=1; i<=k; i++)            mult(cow[i].h,cow[i].h,cow[i].a,cow[i].c);        for(int i=0; i<=cow[k].a; i++)            if(dp[i]>max1)                max1=dp[i];        cout<<max1<<endl;    }    return 0;}