思路:用DFS解决,注意这种记录过程的搜索,用一个一维数组来记录一次完整的搜索,达到要求就把这个过程存放到二维数组中去
#include<cstdio>
int n;
int flag[11];
int a[10001][11];
int ans;
void dfs(int k,int sum){
if(k>10){
if(sum==n){
ans++;//统计方案总数
for(int i=1;i<=10;i++){
a[ans][i]=flag[i];//这种方案可以就放入数组中存下来
}
}
return;
}
if(sum>n)return;//如果超出了要求,就直接忽略
for(int i=1;i<=3;i++){//任意选一种做下一种调料
flag[k]=i;//将使用的调料记录下来
dfs(k+1,sum+i);//查看下一种调料
flag[k]=0;//回溯
}
}
int main(){
scanf("%d",&n);
dfs(1,0);//从第一种调料开始尝试,美味程度为0
printf("%d\n",ans);
for(int i=1;i<=ans;i++){
for(int j=1;j<=10;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}