//一开始写错了,过程中分数是可以超过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;
}