第1关:排列
题目描述:
1.设计算法从前m个大写字母(m≤26)种取出n个字母的所有排列(组合),并编程实现
输入格式
输入M N
1<=M=26, N<=M
输出格式
按字典序输出排列
注意:行末不输出多余空格
测试输入:
4 2
预期输出:
A B
A C
A D
B A
B C
B D
C A
C B
C D
D A
D B
D C
分析:
无
代码实现:
#include<stdio.h>
void Perm(int a[],int b[],int c[],int n,int m,int L){
if(n==L){
for(int i = 0; i <L; i++) {
if(i==L-1){
printf("%c\n",c[i]);
}
else{
printf("%c ",c[i]);
}
}
return;
}
else{
for(int i=0;i<m;i++){
if(b[i]!=1){
c[n]=a[i];
b[i]=1;
Perm(a,b,c,n+1,m,L);
b[i]=0;
}
}
}
}
int main(){
int m,n;
scanf("%d %d",&m,&n);
int a[m],b[m],c[n];
for(int i=0;i<m;i++){
a[i]='A'+i;
b[i]=0;
}
Perm(a,b,c,0,m,n);
return 0;
}
第2关:子集合
题目描述:
设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法?
输入格式
输入数据第1行有2个正整数n和c,n表示S的大小,c是子集和的目标值
接下来的1行中,有n个正整数,表示集合S中的元素
n<10,c<100
输出格式
输出所有满足条件的集合,当问题无解时,输出“No Solution!”。
注意:末尾不输出多余空格
按照输入顺序输出,比如第一个满足条件的子集合是[2 2 6],那么就先输出它,子集合内的数也按照输入顺序输出
测试输入:
5 10
2 2 6 5 4
预期输出:
2 2 6
6 4
分析:
无
代码实现:
#include<stdio.h>
void Chir(int s[],int b[],int c,int m,int &count,int L){
if(m==L){
int a=0;
for(int i=0;i<L;i++){
if(a>c){
break