0分

P1064 [NOIP2006 提高组] 金明的预算方案

CodingFrog1 @ 2024-08-06 21:07:11

#include<bits/stdc++.h>
#define maxn 500005
using namespace std;
struct zj
{
    int zxzyd;
    int jg;
    int zyd;
    bool fj1;
    int zyd1;
    int jg1;
    bool fj2;
    int zyd2;
    int jg2;
};
int dp[maxn],maxj;
zj st[maxn];
int top;
int main()
{
    int m;
    cin>>maxj>>m;
    for(int i=1;i<=m;i++)
    {
        int xi,yi,zi;
        cin>>xi>>yi>>zi;
        if(zi==0)   st[++top].jg=xi,st[top].zyd=xi*yi;
        else if(st[zi].fj1!=0)
        {
            st[zi].fj1=1;
            st[zi].jg1=xi;
            st[zi].zyd1=xi*yi;
            st[zi].zxzyd=min(st[zi].jg1,st[zi].jg);
        }
        else
        {
            st[zi].fj2=1;
            st[zi].jg2=xi;
            st[zi].zyd2=xi*yi;
            st[zi].zxzyd=min(st[zi].jg1,min(st[zi].jg2,st[zi].jg));
        }

    }
    for(int i=1;i<=top;i++)
    {
        for(int j=maxj;j>=st[i].zxzyd;j--)
        {
            if(st[i].fj1==0)    dp[j]=max(dp[j],dp[j-st[i].jg]+st[i].zyd);
            if(st[i].fj2==0)    dp[j]=max(dp[j],dp[j-st[i].jg1]+st[i].zyd1);
            if(st[i].fj2==1)    dp[j]=max(dp[j],dp[j-st[i].jg1]+st[i].zyd2);
        }
    }
    cout<<dp[maxj];
}

by saam @ 2024-08-10 21:08:01

@CodingFrog1 这题用动态规划


|