动态规划(完全背包的变形)

来源:互联网 发布:方便面怎么煮好吃知乎 编辑:程序博客网 时间:2024/05/16 05:02

poj2392

Space Elevator
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 11437 Accepted: 5446

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

Hint

OUTPUT DETAILS:

From the bottom: 3 blocks of type 2, below 3 of type 1, below 6 of type 3.  Stacking 4 blocks of type 2 and 3 of type 1 is not legal, since the top of the last type 1 block would exceed height 40.

Source

#include<stdio.h>
#include<math.h>
#define N 40005
typedef struct
{
    int h,mh,n;
}Block;
Block block[405];
int dp[N];
void qsort(int l,int r)
{
    int i,j;
    Block x;
    if(l<r)
    {
        i=l;
        j=r;
        x=block[l];
        while(i<j)
        {
            while(i<j&&block[j].mh>=x.mh)
                  j--;
            if(i<j)
               block[i++]=block[j];
            while(i<j&&block[i].mh<x.mh)
                  i++;
           if(i<j)
              block[j--]=block[i];
       }
        block[i]=x;
        qsort(l,i-1);
        qsort(i+1,r);
  }
  return ;
}
int main(void)
{
     int i,j,count,n,use[N],ans=0;
     while(~scanf("%d",&n))
     {
           ans=0;
          memset(dp,0,sizeof(dp));
          for(i=0;i<n;i++)
               scanf("%d%d%d",&block[i].h,&block[i].mh,&block[i].n);
         qsort(0,n-1);
         for(i=0;i<n;i++)
         {
               memset(use,0,sizeof(use));
               for(j=0;j<=block[i].mh;j++)
               {
                     if(j<block[i].h||dp[j]>=dp[j-block[i].h]+block[i].h)
                          dp[j]=dp[j];
                     else
                     {
                           if(use[j-block[i].h]<block[i].n)
                           {
                              dp[j]=dp[j-block[i].h]+block[i].h;
                              use[j]=use[j-block[i].h]+1;
                           }
     
                   }
                   if(dp[j]>ans)
                   ans=dp[j];
    
              }
        }
       printf("%d\n",ans);
 }
}

0 0
原创粉丝点击