九度 1358 陈博的平均主义

http://ac.jobdu.com/problem.php?id=1358

好久没做题了,真希望没有任何考试,大家学自己喜欢学的,太多的规则束缚。。

DFS,暂时还没想到别的好办法 下面是几个剪枝

1)所有数字总合为奇数

2)当前总合已大于所有总合一半

一次AC,没排序,不知道排序后能不能有更好的剪枝,不过看了下榜,第一名了已经,应该没有太好的办法了

  

 1 #include <stdio.h>
2 int N,num[10];
3 int A,B;
4 int res=0;
5 bool flag=false;
6 void dfs(int cur_num,int cur_pos)
7 {
8 if(flag)
9 return;
10 if(cur_num*2>res)
11 return;
12 if(cur_num*2==res){
13 flag=1;
14 return;
15 }
16 if(cur_pos>=N)
17 return;
18 dfs(cur_num+num[cur_pos],cur_pos+1);
19 dfs(cur_num,cur_pos+1);
20 }
21 int tran(int n)
22 {
23 res=0;
24 int i=0;
25 while(n){
26 num[i++]=n%10;
27 res+=n%10;
28 n/=10;
29 }
30 return i-1;
31 }
32 bool check(int n)
33 {
34 N=tran(n);
35 flag=false;
36 if(res%2!=0)
37 return false;
38 dfs(0,0);
39 if(flag)
40 return true;
41 return false;
42 }
43 int main()
44 {
45 while(scanf("%d%d",&A,&B)!=EOF){
46 int i,num=0;;
47 for(i=A;i<=B;i++){
48 if(check(i))
49 num++;
50 }
51 printf("%d\n",num);
52 }
53 }


 

原文地址:https://www.cnblogs.com/yangce/p/2297346.html