主要因为我太蒟蒻了,连DP都不会
有没有julao帮忙检查一下代码QwQ\
#include<bits/stdc++.h>
using namespace std;
int n,m,a[70]={0},b[70]={0},w1[70]={0},w2[70]={0},k[70]={0},k1[70]={0},k2[70]={0},f[70][33000]={0};
//a数组存附件的费用,b数组存主件的费用,w1数组存附件的价值,w2数组存主件的价值
//k数组输入附件对应的主件,k1数组存第一个附件对应的主件,k2数组存第二个附件对应的主件
int main()
{
cin>>n>>m;
int h=0;
for(int i=1;i<=m;i++){
cin>>a[i]>>w1[i]>>k[i];
w1[i]*=a[i];
if(k[i]==0){
h++;b[h]=a[i];w2[h]=w1[i];
}
else if(k1[k[i]]==0)k1[k[i]]=i;
else k2[k[i]]=i;
}
for(int i=1;i<=h;i++){
for(int j=n;j>=1;j--){
f[i][j]=max(f[i][j],f[i-1][j]);//初始化
if(j-b[i]-a[k1[i]]-a[k2[i]]>=0)//两个都选
f[i][j]=max(f[i][j],f[i-1][j-b[i]-a[k1[i]]-a[k2[i]]]+w2[i]+w1[k1[i]]+w1[k2[i]]);
if(j-b[i]-a[k2[i]]>=0)//选第二个附件
f[i][j]=max(f[i][j],f[i-1][j-b[i]-a[k2[i]]]+w2[i]+w1[k2[i]]);
if(j-b[i]-a[k1[i]]>=0)//选第一个附件
f[i][j]=max(f[i][j],f[i-1][j-b[i]-a[k1[i]]]+w2[i]+w1[k1[i]]);
if(j-b[i]>=0)//两个都不选
f[i][j]=max(f[i][j],f[i-1][j-b[i]]+w2[i]);
}
}
cout<<f[h][n];
}
60pts