暗黑游戏

先贴题目:

暗黑游戏_第1张图片
暗黑游戏_第2张图片

默默地说一句,YCOJ可真好用!
这道题明显就可以套用多重背包的做法,我先把多重背包代码给大家展示一下

#include
using namespace std;

int v[1010],w[1010],s[1010];
int V[1010*11],W[1010*11];
int F[2020];

int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	int k=0;
	for(int i=1;i<=n;i++){
		scanf("%d %d %d",&v[i],&w[i],&s[i]);
		int x=1;
		while(x<=s[i]){
			k++;
			V[k]=v[i]*x;
			W[k]=w[i]*x;
			s[i]-=x;
			x*=2;
		}
		if(s[i]>0){
			k++;
			V[k]=v[i]*s[i];
			W[k]=w[i]*s[i];
		}
	}
	for(int i=1;i<=k;i++){
		for(int j=m;j>=V[i];j--){
			F[j]=max(F[j],F[j-V[i]]+W[i]);
		}
	}
	printf("%d",F[m]);
	return 0;
}

这就是多重背包的做法了

然后我们在这个基础上稍作修改就又可以水一道题了

修改后如下:

#include
using namespace std;

long long n,k,V1,V2,w1[1000009],w2[10000009],v[10000009],p[10000009],vp[10000009],wp1[10000009],wp2[10000009],f[1009][1009];

int main(){
	cin>>n>>V1>>V2;
	for(long long i=1;i<=n;i++){
		cin>>w1[i]>>w2[i]>>p[i]>>v[i];
		int x=1;
		if(p[i]==0) {
			p[i]=min(V1/w1[i],V2/w2[i]);
		}
		while(x<=p[i]){
			k++;
			wp1[k]=w1[i]*x;
			wp2[k]=w2[i]*x;
			vp[k]=v[i]*x;
			p[i]-=x;
			x*=2;
		}
		if(p[i]>0){
			k++;
			wp1[k]=w1[i]*p[i];
			wp2[k]=w2[i]*p[i];
			vp[k]=v[i]*p[i];
		}
	}
	for(long long i=1;i<=k;i++){
		for(long long j=V1;j>=wp1[i];j--){	
			for(long long k=V2;k>=wp2[i];k--){
				f[j][k]=max(f[j][k],f[j-wp1[i]][k-wp2[i]]+vp[i]);
			}
		}
	}
	cout<<f[V1][V2];
	return 0;
}

bye~~~
期待下次相见

你可能感兴趣的:(c++)