#include<iostream> // https://www.luogu.com.cn/problem/P2089
using namespace std;
int n,cnt;
int record[59050][15]; // record记录每种答案
int ans[15]; //(开record的reason:题目要求先输出方案数,后输出方案)
void dfs(int k,int sum){// 第k种调料,质量和为sum
if(sum>n) return; // 剪枝
if(k==11){ // 注:此处不能写成if(k==1&&sum==n)
if(sum==n){ // 如果写成if(k==1&&sum==n),会导致sum<n的情况无法return(无限递归下去)
cnt++; // 记录方案数
for(int i=1;i<=10;i++)
record[cnt][i]=ans[i]; // record数组存储
}
return; // 注意:return一定要写在外层if
}
for(int i=1;i<=3;i++){
ans[k]=i;
dfs(k+1,sum+i);
ans[k]=0; // 此句不写也可,后面自动覆盖
}
}
int main(){
cin>>n;
dfs(1,0);
if(cnt==0){ // can't find answer
cout<<0<<endl;
return 0;
}
cout<<cnt<<endl; // 先输出方案数
for(int i=1;i<=cnt;i++){
for(int j=1;j<=10;j++){
cout<<record[i][j]<<" ";
}
cout<<endl;
}
return 0; // perfect! Bye~
}
DFS习题-洛谷P2089烤鸡
于 2023-12-31 16:11:17 首次发布