# tzd C.3 个 C.T(n)= T(n/2)+1,T(1)=1 C.问题规模不同,问题性质相同 D.以上皆可行。但不同方法,算法复杂度上界可能不同 D.深度优先 D.14 D. if(x==a[low]) return low; return –1; C.回溯算法需要借助队列这种结构来保存从根结点到当前扩展结点的路径 A.确定解空间的时间 B.剪枝函数 A.广度优先 B.大根堆 D.队列式(FIFO)分枝限界法与优先队列式分枝限界法 A.分支界限法 C.结点的优先级 C.贪心选择性质 B.n 皇后问题 D.O(nlog2n) D.对于同一背包与相同的物品,做背包问题取得的总价值一定大于等于做 0/1 背包问题 B.108 B.动态规划法 D.动态规划法 D.子问题重叠性质C.最优子结构性质 D.深度优先遍历 斐波那契数列 #include int Fibon1(int n) { if (n == 1 || n == 2) { return 1; } else { return Fibon1(n - 1) + Fibon1(n - 2);} } int main() { int n = 0; int ret = 0; scanf("%d", &n); ret = Fibon1(n); printf("ret=%d", ret); return 0; } 众数 #include #include int n; int main(){ int max; int position; scanf("%d",&n); int data[n], num[n]; memset(&data , 0 , sizeof(data)); memset(&num , 0 , sizeof(num)); for(int i=0 ; i using namespace std; const int N=1010; int v[N],w[N],f[N]; int n,m; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]); for(int i=1;i<=n;i++) for(int j=m;j>=v[i];j--) { f[j]=max(f[j],f[j-v[i]]+w[i]); } printf("%d",f[m]); return 0; } 正确答案: 设该年级的人数为x,租船数为y。因为每只船坐10人正好多出2个座位,则 x=10*y-2;因为每只船多坐2人即12人时可少租1只船(没有说恰好全部座位占满),有x+z=12*(y1),z表示此时空出的座位,显然z<12。让 y从1到100(实际上y取更大范围的结果是相同的)、z从 0到 11 枚举,求出最大的 x即可。对应的程序如下:#include int solve(){ int xy; z; for(y=1;y<=100;y++) for(z=0;z<12;z++) if(10*y-2-12*(y-1)-z) x=10*y-2; return x;} void main(){ print£(“求解结果\n”); printf(”最多人数:%d\n",solve()) 正确答案: 设fstr,n)返回含n个字符的字符串str是否为回文,其递归模型如下: fstr,n)=true 当n=0或者n=1时 fstr,n)=flase 当 str[0]≠str[n-1]时 f(str,n)=fstr+1,n-2) 其他情况对应的递归算法如下:#include #include bool isPal(char *str,int n)//str回文判断算法{ if(n-0|| n=1) return true; if(str[0]!=str[n-1]) return false; return isPal(str+1,n-2):} void disp(char *str) int n=strlen(str); if(isPal(str,n)) printf(”%s是回文\n”,str); else printf(”%s不是回文\n”,str);} void main(){ printf(“求解结果\n”): disp("abcba”); disp("a”): disp("abc”): 对应的程序如下:#include #include using namespace std: woid solve(set s)//输出集合的元素{ set #define INF 0x3f3f3f3f //定义∞ #define MAXV 101 int A[MAXV][MAXV]; //邻接矩阵 int n,m; int s,t; int dist[MAXV]; void BellmanFord(int v) //贝尔曼-福特算法 { int i,k,u; for (i=0;idist[i]+A[i][u]) dist[u]=dist[i]+A[i][u]; } } } } } int main() { int i,j; int a,b,l; scanf("%d%d",&n,&m); //输入n、m for (i=0;i #include using namespace std; typedef int ElemType; typedef struct node { ElemType data; //数据元素 truct node *lchild; //指向左孩子结点 struct node *rchild; //指向右孩子结点 } BTNode; //二叉链结点类型 BTNode *CreateBTree(ElemType a[],ElemType b[],int n) //对应例2.8的算法由先序序列a[0..n-1]和中序序列b[0..n-1]建立二叉链 { int k; if (n<=0) return NULL; ElemType root=a[0]; //根结点值 BTNode *bt=(BTNode *)malloc(sizeof(BTNode)); bt->data=root; for (k=0;klchild=CreateBTree(a+1,b,k); //递归创建左子树 bt->rchild=CreateBTree(a+k+1,b+k+1,n-k-1); //递归创建右子树 return bt; } void DispBTree(BTNode *bt) //采用括号表示输出二叉链bt { if (bt!=NULL) { printf("%d",bt->data); if (bt->lchild!=NULL || bt->rchild!=NULL) { printf("("); //有孩子结点时才输出( DispBTree(bt->lchild); //递归处理左子树 if (bt->rchild!=NULL) printf(","); //有右孩子结点时才输出, DispBTree(bt->rchild); //递归处理右子树 printf(")"); //有孩子结点时才输出) } } } void DestroyBTree(BTNode *&bt) //对应例2.9的算法 //释放以bt为根结点的二叉树 { if (bt!=NULL) { DestroyBTree(bt->lchild); DestroyBTree(bt->rchild); free(bt); } }