쓰레기 함정

https://www.luogu.org/problem/show?pid=1156이 문제의 상태는 여러 가지 표현 방법이 있다.f[i]는 i의 높이에 쌓일 때 최대 생명치가 얼마인지 나타낸다.f[i+a[j]=max(f[i+a[j]], f[i])를 쌓아두기;f[i]=f[i]+b[j]를 먹다.2. bool f[i][j]는 i 높이에 도달할 수 있는지, j 혈액량을 나타낸다.그리고 시간 복잡도는 n.×T×D, DP의 상수는 매우 작기 때문에 1억 정도의 데이터는 과감하게 뛸 수 있다.
#include
#define Max(x,y) x>y?x:y
using namespace std;
struct per{
    int t,f,h;
    void read()
    {scanf("%d%d%d",&t,&f,&h);}
}p[105];
bool cmp(per a,per b)
{return a.t1500][350];
int main()
{
    int d,g;
    scanf("%d%d",&d,&g);
    for(int i=1;i<=g;i++)
        p[i].read();
    sort(p+1,p+g+1,cmp);
    int n=p[g].t;
    int ans=10;
    for(int i=0;i<=10;i++)
        dp[i][0]=1;
    for(int i=1;i<=g;i++)
    for(int j=n;j>=0;j--)
    for(int k=d;k>=0;k--)
    {
        if(dp[j][k]&&j>=p[i].t)
        {
            dp[j][k+p[i].h]=1;
            if(k+p[i].h>=d)
            {
                ans=p[i].t;
                printf("%d",ans);
                return 0;
            }
            dp[j+p[i].f][k]=1;
        }
    }
    ans=10;
    for(int i=1;i<=g;i++)
    {
        if(ans>=p[i].t)
            ans+=p[i].f;
        else break;
    }
    printf("%d",ans);
    return 0;
}

좋은 웹페이지 즐겨찾기