样例过了,不知道哪的问题,求调。
#include <bits/stdc++.h>
#define INF 99999999
using namespace std;
int n,m,k,d=INF,ans1=INF,ans2=0,a[10010],b[10010],p[10010],l[10010],h[10010],f[10010][1010];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main()
{
n=read();m=read();k=read();
for(int i=0;i<n;i++)a[i]=read(),b[i]=read();
for(int i=0;i<=n;i++)l[i]=0,h[i]=m+1;
for(int i=0;i<k;i++)
{
p[i]=read();
l[p[i]]=read(),h[p[i]]=read();
}
f[0][0]=INF;
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
f[i][j]=INF;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(j>=a[i-1])
{
if(j<m)
{
f[i][j]=min(f[i][j],f[i-1][j-a[i-1]]+1);
f[i][j]=min(f[i][j],f[i][j-a[i-1]]+1);
}
if(j==m)
for(int k=m-a[i-1];k<=a[i-1];k++)
{
f[i][j]=min(f[i][j],f[i-1][k]+1);
f[i][j]=min(f[i][j],f[i][k]+1);
}
}
for(int j=1;j<=m;j++)
if(j+b[i-1]<=m)f[i][j]=min(f[i][j],f[i-1][j+b[i-1]]);
for(int j=0;j<=l[i];j++)
f[i][j]=INF;
for(int j=m;j>=h[i];j--)
f[i][j]=INF;
}
for(int i=0;i<m;i++)
ans1=min(ans1,f[n][i]);
if(ans1!=INF)printf("1\n%d",ans1);
else
{
for(int i=0;i<=n;i++)
{
bool flag=1;
for(int j=0;j<=m;j++)
if(f[i][j]!=INF)flag=0;
if(flag)
{
d=i;
break;
}
}
for(int i=0;i<k;i++)
if(p[i]<d)ans2++;
printf("0\n%d",ans2);
}
return 0;
}
附赠#3数据