说不上是背包的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;
}