48WangYanJi @ 2023-10-27 17:40:54
4~9WA,代码如下:
#include<bits/stdc++.h>
using namespace std;
struct goo{
int v,p,fo=0;//价格,价值,附件数
};
int main()
{
int n,m;
cin>>n>>m;
int a[n+1];//left
goo b[m][3];
for(int i=0;i<=n;i++){
a[i]=0;
}
for(int i=0;i<m;i++){
int V,W,Q;
cin>>V>>W>>Q;
if(Q!=0){
b[Q-1][b[Q-1][0].fo+1].v=V;
b[Q-1][b[Q-1][0].fo+1].p=V*W;
b[Q-1][0].fo++;
b[i][0].v=-1;
}else{
b[i][0].v=V;
b[i][0].p=V*W;
}
}//先按顺序存,空出位置好判定
for(int i=0;i<m;i++){
if(b[i][0].v==-1){
continue;
}
for(int k=1;k<=b[i][0].fo;k++){
b[i][k].v+=b[i][0].v;
b[i][k].p+=b[i][0].p;//如果买附件,自动买主件(后计算连锁防HACK)
}
}
for(int i=0;i<m;i++){
if(b[i][0].v==-1){
continue;
}
for(int j=n;j>=0;j--){
for(int k=0;k<=b[i][0].fo;k++){
if(j>=b[i][k].v) a[j]=max(a[j],a[j-b[i][k].v]+b[i][k].p);
}//对于每一套物品,决策不同购买方式
}
}
cout<<a[n];
return 0;
}