2012 蓝桥杯 预赛

//一开始写错了,过程中分数是可以超过100的,也完全可以小于0
//其实这一题并不需要标记,因为每次深搜都会赋值,不需要判断是否重复 
#include<cstdio>
int a[11]={-1};
void print(){
	for(int i=1;i<=10;i++){
		printf("%d%c",a[i],i==10?'\n':' ');
	}
}
//序号从1-10 
void DFS(int x,int score){//关于什么时候用void什么时候用int,有时候如果实在没结果会让输出-1 
	if(x==11){
		if(score==100) print();
		return;//只要到达了11.总是要退出的 
	}
//	if(x>=11||score>100||score<0) return;分数是完全可能超过100的 
//	if(x<11){
		a[x]=1;
		DFS(x+1,score*2);//正确
//		a[x]=-1;
//	}
//我去!直接删成这样也可以 
//	if(x<11){ 
		a[x]=0;
		DFS(x+1,score-x); 
//		a[x]=-1; 
//	}
//	return;	
} 
 
int main(){
	DFS(1,10);
	return 0;
}


标准答案:

//对提供的答案稍作修改,稍微好理解一点 
#include<cstdio>
//score为完成第n题后的分数 
void f(char s[],int n,int score){
	if(n==0){
		if(score==10) puts(s);
		return;
	}
	//第n题答错
	s[n]='0'; 
	f(s,n-1,score+n);//注意这里,既然第n题答错,那么完成第n-1题时就应当获得score+n分
	//如果第n题是答对,那么完成第n题的分数必须是偶数 
	if(score%2==0){
		s[n]='1';
		f(s,n-1,score/2);
	} 
}
int main(){
	char s[12];
	s[0]=' ';
	s[11]='\0';
	
	f(s,10,100); 
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值