我的做法对不对?
查看原帖
我的做法对不对?
390770
S0CRiA楼主2021/5/9 17:50

把有加有减转换为全加,形成01背包

只得了10pts

//P1877
#include <iostream>
#include <cstdio>
int n,bl,ml,v[1010],dp[1010],minv=2147483647,sumv,V;

int main(){
	scanf("%d%d%d",&n,&bl,&ml);
	for(int i=1; i<=n; ++i){
		scanf("%d",&v[i]);
		minv=std::min(minv,v[i]),sumv+=v[i],v[i]<<=1;
	}
	
	V=ml+sumv-bl,minv<<=1,sumv<<=1;
	if(minv>V||sumv<V) return puts("-1")&0;
	
	for(int i=1; i<=n; ++i)
		for(int j=V; j>=v[i]; --j)
			dp[j]=std::max(dp[j],dp[j-v[i]]+v[i]);
	printf("%d",dp[V]>>1);
	return 0;
}
2021/5/9 17:50
加载中...