10pts求助!!!

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

littlebug @ 2023-07-30 17:53:26

提交记录

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
//设一个物品的权值=价格与重要度的乘积(vi*pi) 
const int MAXN=32005,MAXM=62;
int ps[MAXM]; //ps[i]表示第i件物品的价格 
int ns[MAXM][2]={}; //每个物品的附件编号 
int vs[MAXM][3]={}; /* vs[i][j]表示以第i个物品为主件,带有附件j时的权值和 
                     * j=0:无附件 j=1:附件1 j=2:附件2 (0表示无)*/
int vi=0;
int n,m;
int dp[MAXN]={}; //dp[i][j]表示花j元买i个物品最大的权值和 
int main()
{
    cin>>n>>m;
    int v,p,q;
    for(int i=1;i<=m;++i)
    {
        cin>>v>>p>>q;
        ps[i]=v;
        if(q)
        {
            if(vs[q][1])
            {
                vs[q][2]=v*p;
                ns[q][1]=i;
            }
            else
            {
                vs[q][1]=v*p;
                ns[q][0]=i;
            }
        }
        else
            vs[++vi][0]=v*p;
    }
    for(int i=1;i<=m;++i)
    {
        for(int j=n;j>=ps[i];--j)
        {
            dp[j]=max(dp[j],dp[j-ps[i]]+vs[i][0]);
            if(ns[i][0] && j-ps[i]-ps[ns[i][0]]>=0) //配件1 
                dp[j]=max(dp[j],dp[j-ps[i]-ps[ns[i][0]]]+vs[i][0]+vs[i][1]);
            if(ns[i][1] && j-ps[i]-ps[ns[i][1]]>=0) //配件2 
                dp[j]=max(dp[j],dp[j-ps[i]-ps[ns[i][1]]]+vs[i][0]+vs[i][2]);
            if(ns[i][0] && ns[i][1] && j-ps[i]-ps[ns[i][0]]-ps[ns[i][1]]>=0) //配件1,2 
                dp[j]=max(dp[j],dp[j-ps[i]-ps[ns[i][0]]-ps[ns[i][1]]]+vs[i][0]+vs[i][1]+vs[i][2]);
        }
    }
    cout<<dp[n];
    return 0;
}

大佬们可以帮帮我吗qwq


|