无优先级运算--ID-DFS

                                                               无优先级运算

问题描述:

给定n 个正整数和4 个运算符+、-、*、/,且运算符无优先级,如2+3*5=25。对于

任意给定的整数m,试设计一个算法,用以上给出的n 个数和4 个运算符,产生整数m,

且用的运算次数最少。给出的n个数中每个数最多只能用1 次,但每种运算符可以任意使用。

输入格式(arit.in):

第1行,有2个正整数n和m。

第2行,给定的用于运算的n个正整数。

输出格式(arit.in):

将计算出的产生整数m 的最少无优先级运算次数以及最优无优先级运算表达式输出。

输入示例

5 25

5 2 3 6 7

输出示例

2

2+3*5

 

算法思想:枚举使用的运算符个数,以它作为dfs的深度,然后dfs()到指定的深度。

该算法比bfs用的空间少,但耗时更多。

代码
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 int n,m,a[520000],s[520000],flag=0,sum,f[100000]={0};
5 char fu[520000];
6
7 int dfs(int x,int k)
8 {
9
10 if(k>x)
11 if(cal(k))
12 {
13 sum=k;
14 return 1;
15 }
16 else return 0;
17
18 int i,j;
19 for(i=1;i<=n;i++)
20 if(f[i]==0)
21 {
22 s[k+1]=a[i];
23 f[i]=1;
24 for(j=1;j<=4;j++)
25 {
26 if(j==1)fu[k+1]='+';
27 if(j==2)fu[k+1]='-';
28 if(j==3)fu[k+1]='*';
29 if(j==4)fu[k+1]='/';
30 if(dfs(x,k+1))return 1;
31 }
32 f[i]=0;
33 }
34
35
36 return 0;
37 }
38
39 int cal(int k)
40 {
41 int x=s[1];
42 int i;
43 for(i=1;i<=k-1;i++)
44 {
45 if(fu[i]=='+')x+=s[i+1];
46 if(fu[i]=='-')x-=s[i+1];
47 if(fu[i]=='*')x*=s[i+1];
48 if(fu[i]=='/')x/=s[i+1];
49 }
50 return (x==m);
51 }
52
53
54 int main(){
55 FILE *in,*out;
56 in=fopen("arit.in","r");
57 out=fopen("arit.out","w");
58 fscanf(in,"%d%d",&n,&m);
59 int i,j;
60 for(i=1;i<=n;i++)
61 fscanf(in,"%d",&a[i]);
62 for(j=0;j<n;j++)
63 {
64 sum=0;
65 if(dfs(j,0))
66 {
67 // printf("%d\n",sum-1);
68 fprintf(out,"%d\n",sum-1);
69 for(i=1;i<=sum-1;i++)
70 {
71 // printf("%d%c",s[i],fu[i]);
72 fprintf(out,"%d%c",s[i],fu[i]);
73 }
74 // printf("%d\n",s[i]);
75 fprintf(out,"%d\n",s[i]);
76 // system("pause");
77 return 0;
78 }
79 }
80 fprintf(out,"No Solution!\n");
81 //printf("Not found\n");
82 //system("pause");
83 fclose(in);
84 fclose(out);
85 return 0;
86 }
87

 

posted @ 2010-09-24 10:41  Danty  阅读(2677)  评论(0编辑  收藏  举报