用多重背包(二进制优化的)为什么不行?
查看原帖
用多重背包(二进制优化的)为什么不行?
86624
洛谷Onlinejudge楼主2020/9/5 16:02

貌似所有提交记录里就我只有20分了;

提交记录

code:

#include "bits/stdc++.h"
using namespace std;
#define Long long long int
#define MAXN 11000

Long F[MAXN],U[MAXN],V[MAXN],Size;
Long A[MAXN],B[MAXN],C[MAXN];
int N,M,K,X,SmV,SmU,UT;

int main(void){
	Size=0;
	scanf("%d%d%d",&N,&K,&M);
	for(register int i=1;i<=N;i++){
		scanf("%d%d%d",&SmV,&SmU,&X);
		UT=1;
		while(UT<X){
			V[++Size]=UT*SmV;
			U[Size]=UT*SmU;
			X=X-UT;
			UT<<=1;
		}
		V[++Size]=X*SmV;
		U[Size]=X*SmU;
	}
	N=Size;//二进制拆分
	
	for(register int i=1;i<=N;i++)
		for(register int j=V[i];j<=M;j++)
			F[j]=max(F[j],F[j-V[i]]+U[i]);
	//跑一遍多重背包
	for(register int i=1;i<=K;i++)
		scanf("%lld%lld%lld",&A[i],&B[i],&C[i]);
	for(register int i=1;i<=K;i++)
		for(register int j=M;j>=0;j--)
			for(register Long k=0;k<=j;k++)
				F[j]=max(F[j],F[j-k]+k*k*A[i]+k*B[i]+C[i]);
	printf("%lld\n",F[M]);
	return 0;
}
2020/9/5 16:02
加载中...