http://acm.hdu.edu.cn/showproblem.php?pid=2616
1 /*
2 全排列的变形,输入数据不重复
3 */
4 #include <iostream>
5 #include <stdio.h>
6 #include <string.h>
7 #include <math.h>
8 using namespace std;
9 int a[15],mm[15];
10 int used[15];
11 int cal;
12 int t;
13 int ans=0xfffffff;
14 void dfs(int n,int m)
15 {
16 //当血小于等于0时,比较并返回
17 if(m<=0)
18 {
19 ans=min(cal,ans);
20 return ;
21
22 }
23 //耗费子弹数加1
24 cal++;
25 for(int i=0;i<n;i++)
26 {
27 //没有使用过则使用,使用完后恢复
28 if(!used[i])
29 {
30 used[i]=1;
31 if(m<=mm[i])
32 dfs(n,m-2*a[i]);
33 else
34 dfs(n,m-a[i]);
35 used[i]=0;
36 }
37 }
38 cal--;
39 }
40
41 int main()
42 {
43 int n,m;
44 while(scanf("%d%d",&n,&m)!=EOF)
45 {
46 ans=0xfffffff;
47 memset(used,0,sizeof(used));
48 cal=0;
49 for(int i=0;i<n;i++)
50 scanf("%d%d",&a[i],&mm[i]);
51 dfs(n,m);
52 if(ans>20)
53 printf("-1\n");
54 else
55 printf("%d\n",ans);
56
57 }
58 return 0;
59 }