P2851 22分求助
  • 板块题目总版
  • 楼主Naoxiaoyu
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/6/28 15:59
  • 上次更新2023/11/3 12:14:33
查看原帖
P2851 22分求助
1011279
Naoxiaoyu楼主2023/6/28 15:59
#include<bits/stdc++.h>
using namespace std;
const int MX=1e9; 
int v[110],c[110];
int f1[10000010],f[10000010];
int n,t;
int main()
{
	scanf("%d%d",&n,&t);
	int num=0,mx=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&v[i]);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&c[i]);
		mx=max(mx,v[i]);
		num+=v[i]*c[i];
	}
	if(num<t)
	{
		printf("-1");
		return 0;
	}
	for(int i=1;i<=mx+t;i++)
	{
		f1[i]=f[i]=MX;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=v[i];j<=mx;j++) 
		{
			f1[j]=min(f1[j],f1[j-v[i]]+1);
		}
	}
	for(int i=1;i<=n;i++)
	{
		int cnt=1;
		while(cnt<=c[i])
		{
			for(int j=mx+t;j>=cnt*v[i];j--)
			{
				f[j]=min(f[j],f[j-v[i]*cnt]+cnt); 
			}
			c[i]-=cnt;
			cnt*=2;
		}
		if(c[i])
		{
			for(int j=mx+t;j>=v[i];j--)
			{
				f[j]=min(f[j],f[j-v[i]*c[i]]+c[i]);
			}
		}
	}
	int ans=MX;
	for(int i=t;i<=mx+t;i++)
	{
		ans=min(ans,f[i]+f1[i-t]);
	}
	if(ans==MX) printf("-1");
	else printf("%d",ans);
	return 0;
}
2023/6/28 15:59
加载中...