数据很小,直接全排列求解。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <algorithm>
#define inf (1<<29)
using namespace std;
int n,m;
int a[11];
int d[11];
int f[11];
int ans;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&d[i]);
}
for(int i=1;i<=n;i++)
{
f[i]=i;
}
ans=inf;
do
{
int cnt=0;
int s=m;
for(int i=1;i<=n;i++)
{
cnt++;
if(s<=d[f[i]])
{
s-=a[f[i]]*2;
}
else
{
s-=a[f[i]];
}
if(s<=0)
{
if(ans>cnt)
{
ans=cnt;
}
break;
}
}
}while(next_permutation(f+1,f+n+1));
if(ans==inf)
{
cout<<"-1"<<endl;
}
else
{
cout<<ans<<endl;
}
}
return 0;
}