MnZn求助CE
查看原帖
MnZn求助CE
1056514
zky2023楼主2024/7/20 09:30
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int N=5e4;
int n,m,sum=0,maxn,ans=0x3f3f3f3f;
int v[N],c[N],f[N],g[N];
signed main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",v+i);maxn=max(maxn,v[i]*v[i]);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",c+i);sum+=v[i]*c[i];
	}
	if(sum<m)
	{
		printf("-1\n");return 0;
	}
	for(int i=1;i<=n;i++)
	{
		if(m==v[i] and c[i]!=0)
		{
			printf("1\n");return 0;
		}
	}
	memset(f,0x3f,sizeof(f));f[0]=0;
	memset(g,0x3f,sizeof(g));g[0]=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=v[i];j<=maxn;j++)
		{
			g[j]=min(g[j],g[j-v[i]]+1);
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=c[i];j<<=1)
		{
			for(int k=m+maxn;k>=j*v[i];k--)
			{
				f[k]=min(f[k],f[k-j*v[i]]+j);
			}
			c[i]-=j;
		}
		if(c[i]!=0)
		{
			for(int k=m+maxn;k>=c[i]*v[i];k--)
			{
				f[k]=min(f[k],f[k-c[i]*v[i]]+c[i]);
			}
		}
	}
	for(int i=m;i<=m+maxn;i++)
	{
		ans=min(ans,f[i]+g[i-m]);
	}
	printf("%d\n",ans==0x3f3f3f3f?-1:ans);
	return 0;
}
2024/7/20 09:30
加载中...