简单背包,萌新求救。。。
查看原帖
简单背包,萌新求救。。。
579266
Dr_MING楼主2022/11/14 21:50

rt,芝士代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=70;
int cmax,n,cnt;
int w[maxn][3],f1[maxn][3],f2[maxn][3],f[51419];
int red(){
	int as=0;int fl=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')fl=-1;ch=getchar();}
	while(isdigit(ch)){as=as*10+ch-'0';ch=getchar();}
	return as*fl;
}
int main(){
	cmax=red();n=red();
	for(int i=1;i<=n;i++){
		int x,y,z;
		x=red();y=red();z=red();
		if(!z){
			cnt++;
			w[cnt][1]=x;
			w[cnt][2]=x*y;
		}
		if(z){
			if(!f1[z][1]){
				f1[z][1]=x;
				f1[z][2]=x*y;
			}
			else{
				f2[z][1]=x;
				f2[z][2]=x*y;
			}
		}
	}
	for(int i=1;i<=cnt;i++){
		for(int j=cmax;j>=w[i][1];j--){
			f[j]=max(f[j],f[j-w[i][1]]+w[i][2]);
			if(w[i][1]+f1[i][1]<=j)
				f[j]=max(f[j],f[j-w[i][1]-f1[i][1]]+w[i][2]+f1[i][2]);
			if(w[i][1]+f2[i][1]<=j)
				f[j]=max(f[j],f[j-w[i][1]-f2[i][1]]+w[i][2]+f2[i][2]);
			if(w[i][1]+f1[i][1]+f2[i][1]<=j)
				f[j]=max(f[j],f[j-w[i][1]-f1[i][1]-f2[i][1]]+w[i][2]+f1[i][2]+f2[i][2]);
		}
	}
	printf("%d",f[cmax]);
	return 0;
}
2022/11/14 21:50
加载中...