迷之全WA
查看原帖
迷之全WA
359883
Grace25楼主2020/10/31 16:21

想直接用有依赖的背包问题的解法做(附件有不止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;
}
2020/10/31 16:21
加载中...