88分求助,改对必关
查看原帖
88分求助,改对必关
1285033
liyoulin楼主2024/9/16 02:31

代码:

#include<bits/stdc++.h>
using namespace std;
int tot,n,T,w[101],c[101],w1[1501],v1[1501],sum,ans=1e6,res,msk;
int main(){
	cin>>n>>T;
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
	for(int i=1;i<=n;i++){
		cin>>c[i];
		sum+=w[i]*c[i];
	}
	int dpmulti[sum+1],dpfull[sum-T+1];
	for(int i=1;i<=n;i++){
		res=c[i];
		msk=1;
		while(res>msk){
			tot++;
			v1[tot]=msk;
			w1[tot]=msk*w[i];
			res-=msk;
			msk<<=1;
		}
		if(res>0){
			tot++;
			v1[tot]=res;
			w1[tot]=res*w[i];
		}
	}
    for(int i=0;i<=sum;i++){
    	dpmulti[i]=1e7;
    	dpfull[i]=1e7;
	}
	dpmulti[0]=0;
	dpfull[0]=0;
	for(int i=1;i<=tot;i++){
		for(int j=sum;j>=w1[i];j--){
			if(dpmulti[j-w1[i]]+v1[i]<dpmulti[j]){
				dpmulti[j]=dpmulti[j-w1[i]]+v1[i];
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=w[i];j<=sum-T;j++){
			if(dpfull[j-w[i]]+1<dpfull[j]){
				dpfull[j]=dpfull[j-w[i]]+1;
			}
		}
	}
	for(int i=T;i<=sum;i++){
		ans=min(ans,dpmulti[i]+dpfull[i-T]);
	}
	if(ans==1e6) cout<<-1;
	else cout<<ans;
    return 0;
}

评测记录

2024/9/16 02:31
加载中...