mazihang2022 @ 2020-02-19 21:28:06
码风不好请见谅
#include <bits/stdc++.h>
using namespace std;
int maxn;
int a[650],b[650],c[650],dp[320005],dpa[650][50],flag[650],dpb[650][50],sum[650],dpd[650][50];
int main()
{
int n,m;
cin>>m>>n;
// memset(dp,1,sizeof(dp));
for(int i=1; i<=n; i++)
{
cin>>a[i]>>b[i]>>c[i];
flag[c[i]]++;
}
for(int i=1; i<=n; i++)
{
sum[i]=1;
dpa[i][1]=dpa[i][2]=dpa[i][3]=dpa[i][4]=a[i];
dpd[i][1]=dpd[i][2]=dpd[i][3]=dpd[i][4]=a[i]*b[i];
if(flag[i])
{
if(flag[i]==1)
{
sum[i]=2;
for(int j=1; j<=n; j++)
{
if(c[j]==i)
{
dpa[i][2]+=a[j];
dpd[i][2]+=a[j]*b[j];
break;
}
}
}
else
{
sum[i]=4;
int aa=-1,bb=-1;
for(int j=1; j<=n; j++)
{
if(c[j]==i)
{
if(aa==-1)aa=j;
else bb=j;
}
}
dpa[i][2]+=a[aa];
dpd[i][2]+=a[aa]*b[aa];
dpa[i][3]+=a[bb];
dpd[i][3]+=a[bb]*b[bb];
dpa[i][4]+=a[aa]+a[bb];
dpd[i][4]+=a[aa]*b[aa]+a[bb]*b[bb];
}
}
}
for(int i=1; i<=n; i++)
{
if(c[i]==0)
for(int k=1; k<=sum[i]; k++)
{
for(int j=m; j>=dpa[i][k]; j--)
{
dp[j]=max(dp[j-dpa[i][k]]+dpd[i][k],dp[j]);
}
}
}
cout<<dp[m];
}
by System_Tish @ 2020-02-20 15:39:14
@mazihang2022 dalao,您把dp时候的k,j位置换一下 像这样
for(int j=m; j>=1; j--) {
for(int k=1; k<=4; k++) {
if(j>=dpa[i][k])
dp[j]=max(dp[j-dpa[i][k]]+dpd[i][k],dp[j]);
}
by mazihang2022 @ 2020-02-20 19:20:48
谢谢大佬QAQ