0分求助,赏一关
查看原帖
0分求助,赏一关
746761
zzb1217楼主2023/9/13 09:48

这是代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int w[100001],s[100001],dp[100001],f[100001],qwq=0;
signed main()
{
	int n,m,sum=0,ans=INT_MAX;
	cin >> n >> m;
	for (int i=1;i<=n;++i)
	{
		cin >> w[i];
		qwq=max(qwq,w[i]*w[i]);
	}
	for (int i=1;i<=n;++i)
	{
		cin >> s[i];
		sum+=s[i]*w[i];	
	}
	if (sum<m)
	{
		cout << -1 << endl;
		return 0;
	}
	for (int i=1;i<=n;++i)//完全背包 
	{
		for (int j=w[i];j<=qwq;++j)
		{
			f[j]=max(f[j],f[j-w[i]]+1);
		}
	}
	for (int i=1;i<=n;++i)//多重背包 
	{
		for (int j=1;j<=s[i];j--)
		{
			for (int k=m+qwq;k>=s[i]*j;--k)
			{
				dp[j]=min(dp[j],dp[k-j*w[i]]+j);
			}
			s[i]-=j;
		}
		if (s[i]>0)
		{
			for (int awa=m+qwq;awa>=s[i]*w[i];--awa)
			{
				dp[awa]=min(dp[awa],dp[awa-s[i]*w[i]]+s[i]);
			}
		}
	}
	for (int i=m;i<=m+qwq;++i)
	{
		ans=min(ans,dp[i]-f[i-m]);
	}
	cout << ans;;
}
2023/9/13 09:48
加载中...