第五章 习题(一)

来源:互联网 发布:js格式视频 编辑:程序博客网 时间:2024/05/01 04:37

5-1 子集和问题

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int NM=25;int set[NM],x[NM],path[NM],n,Wleft,c;bool Backtrack(int cw,int t){if(t>n){for(int j=1;j<=n;j++)path[j]=x[j];if(cw==c) return true;else return false;  //}Wleft-=set[t];if(cw+set[t]<=c){x[t]=1;if(Backtrack(cw+set[t],t+1)) return true;  //}if(cw+Wleft>=c){x[t]=0;if(Backtrack(cw,t+1)) return true;}Wleft+=set[t];return false;}int main(){int i;while(~scanf("%d%d",&n,&c)){Wleft=0;for(i=1;i<=n;i++){scanf("%d",&set[i]);Wleft+=set[i];}memset(x,0,sizeof(x));if(Backtrack(0,1)){for(i=1;i<=n;i++){printf("%d ",path[i]);}printf("\n");}else printf("No solution.\n");}return 0;}/*5 102 2 6 5 45 112 2 2 2 2*/


5-3 最小重量机器设计问题

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int NM=25;int c[NM][NM],w[NM][NM],x[NM],path[NM],bestw,n,m,d;bool flag;void Backtrack(int t,int cc,int ww){if(t>n){for(int j=0;j<n;j++)path[j]=x[j];bestw=ww;flag=true;return;}for(int i=0;i<m;i++){if(cc+c[t][i]<=d){if(ww+w[t][i]<bestw){ x[t]=i+1;Backtrack(t+1,cc+c[t][i],ww+w[t][i]);}}}}int main(){int i,j;while(~scanf("%d%d%d",&n,&m,&d)){for(i=0;i<n;i++)for(j=0;j<m;j++)scanf("%d",&c[i][j]);for(i=0;i<n;i++)for(j=0;j<m;j++)scanf("%d",&w[i][j]);bestw=0xfffffff;flag=false;Backtrack(0,0,0);if(flag){printf("%d\n",bestw);for(i=0;i<n;i++)printf("%d ",path[i]);}else printf("No solution!");printf("\n");}return 0;}/*3 4 41 2 3 43 2 1 42 2 2 11 2 3 23 2 1 22 2 2 13 4 41 2 3 43 2 3 42 2 2 11 2 3 23 2 1 22 1 2 2*/



5-4 运动员最佳配对

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int NM=25;int n,bestmax,cw,x[NM],p[NM][NM],q[NM][NM],path[NM];void Backtrack(int t){int j;if(t>n){cw=0;for(j=1;j<=n;j++){cw+=p[j][x[j]]*q[j][x[j]];}if(cw>bestmax) {for(int j=1;j<=n;j++) path[j]=x[j];bestmax=cw;}return;}for(j=t;j<=n;j++){swap(x[t],x[j]);Backtrack(t+1);swap(x[t],x[j]);}}int main(){int i,j;while(~scanf("%d",&n)){for(i=1;i<=n;i++) for(j=1;j<=n;j++)scanf("%d",&p[i][j]);for(i=1;i<=n;i++) for(j=1;j<=n;j++)scanf("%d",&q[i][j]);for(i=1;i<=n;i++) x[i]=i;bestmax=0;Backtrack(1);printf("%d\n",bestmax);for(i=1;i<=n;i++) cout<<path[i]<<" ";cout<<endl;}return 0;}/*310 2 32 3 43 4 52 2 23 5 34 5 1*/



5-8 整数变换问题

注:3n+1问题,但不可证明是否一定无解,故只能加入一个步数判断:在一定步数内无方案即认为无解

1)BFS的渣实现,保存路径的方法太烂了

#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int NM=105;int n,m;bool flag;struct Node{int step,vau,path[NM];}node;void BFS(){queue<Node>q1;Node t,pt;t.step=0;t.vau=n;q1.push(t);while(!q1.empty()){t=q1.front();q1.pop();if(t.step>100) {flag=false;break;}if(t.vau==m) {node=t;break;}pt=t;pt.vau=t.vau*3;pt.path[t.step]=1;pt.step=t.step+1;q1.push(pt);pt=t;pt.vau=t.vau/2;pt.path[t.step]=2;pt.step=t.step+1;q1.push(pt);}}int main(){int i;while(cin>>n>>m){if(n==0){cout<<"No solution!"<<endl;continue;}flag=true;BFS();if(!flag){cout<<"No solution!"<<endl;continue;} cout<<node.step<<endl;for(i=node.step-1;i>=0;i--){if(node.path[i]==1) cout<<'f';else if(node.path[i]==2) cout<<'g';}cout<<endl;}return 0;}

2)DFS

#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int NM=105;int maxdep,k,n,m,t[NM];bool found;int fun(int n,int i){if(i==0) n*=3;else n/=2;return n;}void output(){cout<<maxdep<<endl;for(int i=maxdep;i>0;i--){if(t[i]==0) cout<<'f';else if(t[i]==1) cout<<'g';}cout<<endl;}bool search(int dep,int n){if(dep>k) return false;for(int i=0;i<2;i++){int n1=fun(n,i);t[dep]=i;if(n1==m || search(dep+1,n1)){found=true;return true;  //out();}}return false;}void init(){memset(t,0,sizeof(t));}void compute(){k=1;maxdep=100;  //while(!search(1,n)){k++;if(k>maxdep) break;init();}maxdep=k;if(found) output();else cout<<"No solution!"<<endl;}int main(){while(cin>>n>>m){if(n==0){cout<<"No solution!"<<endl;continue;}found=true;compute();}return 0;}




0 0