60求调 WA #6-9
查看原帖
60求调 WA #6-9
1560073
Heyg_future楼主2025/7/2 09:26
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int N=1e4+5;
int n,m,v[N],w[N],q[N],f[75][N][15],ans;
vector<int> pj[N]; 
int main(){
	cin>>n>>m;
	for (int i=1;i<=m;i++) {
		cin>>v[i]>>w[i]>>q[i];
		pj[q[i]].push_back(i);
	}
	int sg=0;
	for (int i=1;i<=m;i++) {
		if (q[i]) continue;
		for (int j=1;j<=n;j++) {
			f[i][j][0]=max({f[sg][j][0],f[sg][j][1],f[sg][j][2],f[sg][j][3]});
			if(j>=v[i])
			 f[i][j][1]=max({f[sg][j-v[i]][0],f[sg][j-v[i]][1],f[sg][j-v[i]][2],f[sg][j-v[i]][3]})+v[i]*w[i];
			if (pj[i].size()>=1) {
				int t=pj[i][0];
				if (j>=v[i]+v[t]) {
					int s=v[i]+v[t];
					f[i][j][2]=max({f[sg][j-s][0],f[sg][j-s][1],f[sg][j-s][2],f[sg][j-s][3]})+v[i]*w[i]+v[t]*w[t];
				}
				
			}
			if (pj[i].size()>=2) {
				int t=pj[i][1];
				if (j>=v[i]+v[t]) {
					int s=v[i]+v[t];
					int c=v[i]*w[i]+v[t]*w[t];
					f[i][j][2]=max({f[i][j][2],f[sg][j-s][0]+c,f[sg][j-s][1]+c,f[sg][j-s][2]+c,f[sg][j-s][3]+c});
				}
				int t1=pj[i][0];
				if (j>=v[i]+v[t]+v[t1]) {
					int s=v[i]+v[t]+v[t1];
					f[i][j][3]=max({f[sg][j-s][0],f[sg][j-s][1],f[sg][j-s][2],f[sg][j-s][3]})+v[i]*w[i]+v[t]*w[t]
					+v[t1]*w[t1];
				}
				
			}
		}
		for (int k=0;k<=3;k++) {
			ans=max(ans,f[i][n][k]);
		}
		sg=i;
	}
	cout<<ans;
	return 0;
}
2025/7/2 09:26
加载中...