50pts 有wa有t萌新求助
查看原帖
50pts 有wa有t萌新求助
130104
loris楼主2021/8/4 00:14

说不上是背包的dp思路

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int p,cnt,b,ans,n,m,k,f[10001][1001],x[10001],y[10001],l[10001],h[10001],t[10001];
int main()
{
	cin>>n>>m>>k; 
	for(int i=0;i<=n-1;i++)
		cin>>x[i]>>y[i];
	for(int i=1;i<=k;i++)
		cin>>p>>l[i]>>h[i],t[p]=i;
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=m;i++)
		f[0][i]=0;
	for(int i=1;i<=n;i++)
	{
		if(!t[i])
		{
			for(int j=1;j<=m;j++)
			{
				for(int k=1;j-k*x[i-1]>=1;k++)
					f[i][j]=min(f[i][j],f[i-1][j-k*x[i-1]]+k);
				if(j+y[i-1]<=m)
					f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]); 
			}
			for(int k=1;m-k*x[i-1]>=1;k++)
				for(int j=m;j>=m-k*x[i-1];j--)
					f[i][m]=min(f[i][m],f[i-1][j]+k);
		}
		else
		{
			for(int j=l[t[i]]+1;j<=h[t[i]]-1;j++)
			{
				for(int k=1;j-k*x[i-1]>=1;k++)
					f[i][j]=min(f[i][j],f[i-1][j-k*x[i-1]]+k);
				if(j+y[i]<=m)
					f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]); 
			}
			b=0;
			for(int j=1;j<=m;j++)
				if(f[i][j]!=inf)
					b=1;
			if(b==0)
			{
				cout<<0<<endl<<cnt; 
				return 0;
			}
			cnt++;
		}
		b=0;
		for(int j=1;j<=m;j++)
			if(f[i][j]!=inf)
				b=1;
		if(b==0)
		{
			cout<<0<<endl<<cnt; 
			return 0;
		}
		/*
		for(int j=1;j<=m;j++)
			cout<<f[i][j]<<' ';
		cout<<endl;
		*/
	}
	ans=inf;
	for(int i=1;i<=m;i++)
		ans=min(ans,f[n][i]);
	cout<<1<<endl<<ans;
	return 0; 
}
2021/8/4 00:14
加载中...