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