1、j+) if( (abs(k-j) = abs(xj-xk) | (xj=xk) )/*xi表示皇后 i 放在棋盘的第 i 行的第xi列*/ return 0;/*能攻击到其他皇后,返回 0 */ return 1;/*不能攻击到其他皇后,返回 1 */ void Backtrack(int t,int n,int *x) /*递归回溯求解*/ int i;if(tn) sum+;/*输出一个方案*/ printf(方案%d:,sum);for(i=1;i=1;k-)if(ai=ak) g=0;break; / 两数相同,标记g=0 if(i=9 & g=1 & a1a4) m1=a2*10+
2、a3;m2=a5*10+a6;m3=a8*10+a9;if(a1*m2*m3+a4*m1*m3=a7*m1*m2) / 判断等式 s+;(-) ,s);%d/%ld+%d/,a1,m1,a4);%ld=%d/%ld ,m2,a7,m3);if(s%2=0) printf(if(i1) i-; / 往前回溯 if(ai=9 & i=1) break;else ai+; / 至第1个数为9结束 共以上%d个解。递归程序实现:/ 桥本分数式递归求解 int a10,s=0; int put(int k);put(1); / 调用递归函数put(1) 共有以上%d个解。/ 桥本分数式递归函数 int
3、put(int k) int i,j,u,m1,m2,m3;if(k=9) for(i=1;=9;i+) / 探索第k个数字取值i ak=i;for(u=0,j=1;=k-1;j+)if(ak=aj) u=1; / 出现重复数字,则置u=1 if(u=0) / 若第k个数字可为i if(k=9 &a4) / 若已个数字,则检查等式 m1=a2*10+a3;if(a1*m2*m3+a4*m1*m3=a7*m1*m2) s+; printf( : / 输出一个解 %d/%d+%d/%d,a1,m1,a4,m2);=%d/%d ,a7,m3);else put(k+1); / 若不到个数字,则调用
4、put(k+1) return s;3. 给定有n个不同的正数组成的集合W=Wi | Wi 0,i=1,2,n和给定正数M,求出M中所有使其和数等于M的子集。即给定一个n个整数的集合W=W1,W2.Wn和整数M,找出和等于M的W的子集。如:W=11,13,24,7 M=31 问题的解为:24,7和11,13,7解可以用布尔向量表示为:0,0,1,1,1,1,0,1又如:W=10,20,30,40,50,60和M=60,则有三种不同长度的解,它们分别是10,20,30,20,40,60.这个问题可以用另一种方法明确表达,使得解是一种明显的长度为n的布尔向量,于是上面的三个解可以用布尔向量表示为:
5、1,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1conio.h#define MAX 1000/global variablesint n=0;/the number of numbersint c=0;/the sum of the subsetint numMAX=0;int count=1;/the number of the element in a subset int resultMAX=0; /the answer of this questionint c_sum=0;/current sum/prototypesvoid swap(int &a,int
6、&b);void back_subset(int i);int main() /declaration int i=0;Please input the number of the numbers: scanf(Please input the sum:c); for(i=1;i+) scanf(numi); back_subset(1); getch();void back_subset(int i) if(c_sum+numi=c) resultcount=numi; for(int temp=1;tempn) if(c_sum+numic) return; for(int j=i; re
7、sultcount+=numj; c_sum+=numj; swap(numi,numj); back_subset(i+1); c_sum-=numj; count-;b) int temp=a; a=b; b=temp;iostreamusing namespace std;const int MAX=11;const int bMAX=1,2,3,4,5,8,11,23,45;int xMAX=0;int sum;int Sum();int SumOfSub(int ,int ,int );void Display(int *);int main() cout sum;int s=0,k
8、=0,r;r=Sum();/ cout r endl;SumOfSub(s,k,r);int Sum() int s=0;for(int i=0;i MAX; s+=bi;int SumOfSub(int s,int k,int r) if(r 0) return 0;xk=1;if(s+bk=sum) Display(x);if(s+bk+bk+1 =sum&s+bk+1 / xk=0;SumOfSub(s,k+1,r-bk);/ void Display(int *x) if(xi=1) cout bi =M为终止条件。具体的算法,我给个大概流程吧int lstN; /保存选取的数int
9、index = 0; /lst中最后的一个数的位置func(W, N) if(N = 0) /遍历完毕 返回 return; for(i=0 to N) if( Wi1 != -1 ) /判断是否已经读取当前值 lstindex+ = Wi0 /当前值加入到保存数组 Wi1 = -1; /设置当前值已经读取,不可再读 if(check() = 0) func(W, N-1); /大小不够M,继续往下读 else if(check() = 1) print(lst); /和为M,输出 lst-index = 0; /回溯,寻找下一组解 Wi1 = 0;check() if(sum(lst) W) return -1; if(sum(lst) return 0; return 1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1