有一种能力叫
“样例WA了也能AC”
这道题最难之处就在于对于主件附件的考虑;
要我来说,只需要把附件记上主件就行了
下面献上本蒟蒻的的代码
注:
这里面有WA样例的代码,但并不影响最后的评测!!!
代码来啦!
#include <cstdio>
#include <iostream>//max的头文件
using namespace std;
//a代表是主件还是附件,b代表某个主件所拥有的附件号码,c是价格*重要度,d是价格
int a[100],b[100][3],c[100],d[100],f[32010];
int main(){
int m,n,x,y,z;//m是个数,n是总钱数
scanf("%d%d",&n,&m);//输入
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);//x是价格,y是重要度,z是是否是主件
c[i]=x*y;
d[i]=x;
//存入
if(!z)a[i]=1;//主件存入1
else{
b[z][0]++;//记录附件个数
b[z][b[z][0]]=i;//记录附件编号
}
}
for(int i=1;i<=m;i++){
if(a[i]){
for(int j=n;j>=d[i];j--){
f[j]=max(f[j],f[j-d[i]]+c[i]);//最普通的递推解析式
if(b[i][0]>0&&j-d[i]-d[b[i][1]]>=0)f[j]=max(f[j],f[j-d[i]-d[b[i][1]]]+c[i]+c[b[i][1]]);
if(b[i][0]==2){
if(j-d[i]-d[b[i][2]]>=0)f[j]=max(f[j],f[j-d[i]-d[b[i][2]]]+c[i]+c[b[i][2]]);
if(j-d[i]-d[b[i][1]]-d[b[i][2]]>=0)f[j]=max(f[j],f[j-d[i]-d[b[i][2]]-d[b[i][1]]]+c[i]+c[b[i][2]]+c[b[i][1]]);
//有附件的递推解析式
}
}
}
}
while(!a[n])n--;//WA样例的代码(去掉)
printf("%d",f[n]);//输出
return 0;
}