想了许久的DP,结果直接上手暴搜就行了。。。
#include<stdio.h>
#include<string.h>
#define N 11
int a[N],b[N],mark[N];
int ans,cnt;
int n,m;
int Min(int x,int y)
{
if(x<y)
return x;
return y;
}
void fun(int m,int cnt)
{
int i;
for(i=1;i<=n;i++)
{
if(mark[i]==-1)
continue;
if(m>b[i])
{
mark[i]=-1;m-=a[i];cnt++;
if(m<=0)
ans=Min(ans,cnt);
fun(m,cnt);mark[i]=0;m+=a[i];cnt--;
}
else
{
mark[i]=-1;m-=2*a[i];cnt++;
if(m<=0)
ans=Min(ans,cnt);
fun(m,cnt);mark[i]=0;m+=2*a[i];cnt--;
}
}
return ;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
memset(mark,0,sizeof(mark));
for(i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
ans=12;
cnt=0;
for(i=1;i<=n;i++)
{
if(m>b[i])
{
mark[i]=-1; m-=a[i]; cnt++;
if(m<=0)
{
ans=1;
break;
}
fun(m,cnt); mark[i]=0; m+=a[i];cnt--;
}
else
{
mark[i]=-1;m-=2*a[i];cnt++;
if(m<=0)
{
ans=1;
break;
}
fun(m,cnt); mark[i]=0;m+=2*a[i];cnt--;
}
}
if(ans!=12)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}