想直接用有依赖的背包问题的解法做(附件有不止2个)。。。但是全WA了。。。
话说我写这么多循环都没TIE
#include<iostream>
#include<algorithm>
using namespace std;
int n,s,m=1,dp[1010],dp_f[1010][1010];
struct thing{
int v,w,h;
}main_item[1010],annex_item[110][110];
int main(){
int v,w,h;
cin >> s >> n;
for(int i=1;i<=n;i++){
cin >> w >> v >> h;
if (!h){//是主件
main_item[0].h++;//件数加一
main_item[main_item[0].h].v = v*w;//储存
main_item[main_item[0].h].w = w;
}else{//是附件
annex_item[h][0].h++;//件数加一
annex_item[h][annex_item[h][0].h].v = v*w;//储存
annex_item[h][annex_item[h][0].h].w = w;
}
}
for(int i=1;i<=main_item[0].h;i++){
for(int j=1;j<=annex_item[i][0].h;j++){//对附件进行0-1背包
w=annex_item[i][j].w;
v=annex_item[i][j].v;
for(int x=s-main_item[i].w;x>=w;x--){
dp_f[i][x]=max(dp_f[i][x],dp_f[i][x-w]+v);
}
}
w=main_item[i].w;
v=main_item[i].v;
for(int j=s;j>=w;j--){//对主件进行0-1背包
dp[j]=max(dp[j],max(dp[j-w]+v,dp[j-w]+v+dp_f[i][s-w]));
}
}
cout << dp[s];
return 0;
}