80pts 求助
查看原帖
80pts 求助
361141
_JF_殉情楼主2023/8/18 13:28

调了很久无果

#include<bits/stdc++.h>
using namespace std;
#define int long long  
const int N = 4e4;
vector<int> g[N];
int dp[70][N],v[N],w[N],q[N],Max;
signed main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		cin>>v[i]>>w[i]>>q[i];
	for(int i=1;i<=m;i++){
		if(q[i]==0){
			Max++,g[Max].push_back(i);
			for(int j=1;j<=m;j++)	if(q[j]==i)	g[Max].push_back(j);
		}
	}
	for(int i=1;i<=Max;i++)	sort(g[i].begin()+1,g[i].end());
	bool f=true;
	for(int i=1;i<=Max;i++){
		// slove that only one 
		if(g[i].size()==1){
			int Now=g[i][0];
			for(int k=n;k>=v[Now];k--){
				dp[i][k]=max(max(dp[i-1][k],dp[i][k]),max(dp[i][k-v[Now]],dp[i-1][k-v[Now]])+v[Now]*w[Now]);
			}
			for(int k=v[Now]-1;k>=0;k--)
				dp[i][k]=dp[i-1][k];
			continue;
		}
		// Slove the others expect first  
		for(int j=1;j<g[i].size();j++){
			int now=g[i][j];
			for(int k=n;k>=v[now];k--)
				dp[i][k]=max(max(dp[i][k],dp[i-1][k]),max(dp[i][k-v[now]],dp[i-1][k-v[now]])+v[now]*w[now]);
		}
		// clear the unuse
		for(int j=n;j>=0;j--){
			if(j+v[g[i][0]]>n)	dp[i][j]=dp[i-1][j];
			else{
				dp[i][j+v[g[i][0]]]=max(max(dp[i-1][j+v[g[i][0]]],dp[i][j+v[g[i][0]]]),dp[i][j]+v[g[i][0]]*w[g[i][0]]),dp[i][j]=dp[i-1][j];
			}
		} 
	}
	int ans=0;
	for(int i=1;i<=Max;i++){
		for(int j=n;j>=0;j--)	
			ans=max(ans,dp[i][j]);
//		cout<<ans<<endl;
	}
	cout<<ans<<endl;
}


2023/8/18 13:28
加载中...