dp30分求调

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

Li_wenjie @ 2023-11-14 17:31:30

#include<bits/stdc++.h>
using namespace std;
const int N=3201;
int v[N],q[N],p[N];
int dp[N][N];//只记主件 money=j,people=i
int fj[N][3];
int ma[N],top=0;
int main()
{
    //freopen("lock.in","r",stdin);
    //freopen("ans.out","w",stdout);
    int n,m;
    cin>>n>>m;
    n/=10;
    for(int i=1;i<=m;i++)
    {
        cin>>v[i]>>p[i]>>q[i];
        v[i]/=10;
        p[i]*=v[i];
        if(q[i]!=0) 
        {
            if(fj[q[i]][1]==0) fj[q[i]][1] = i;
            else fj[q[i]][2] = i;
        }                                       
        else
        ma[++top] = i;
    } 
//  for(int i=1;i<=m;i++) cout<<i<<" "<<p[i]<<endl;
    for(int i=1;i<=top;i++)                                                                                                                                                                                     
            for(int j=1;j<=n;j++)
            {
                int now=ma[i];
                if(j>=v[now])
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-v[now]]+p[now]);
                if(fj[now][1]!=0&&j>=v[now]+v[fj[now][1]])
                {
                    dp[i][j] = max(dp[i][j],dp[i-1][j-v[now]-v[fj[now][1]]]+p[now]+p[fj[now][1]]);
                }

                if(fj[now][2]!=0&&j>=v[now]+v[fj[now][2]])
                {
                    dp[i][j] = max(dp[i][j],dp[i-1][j-v[now]-v[fj[now][2]]]+p[now]+p[fj[now][2]]);
                    dp[i][j] = max(dp[i][j],dp[i-1][j-v[now]-v[fj[now][2]]-v[fj[now][1]]]+p[now]+p[fj[now][2]]+v[fj[now][1]]);
                }
            }
    cout<<dp[top][n]*10;

}

|