这道题正解是枚举,歪解是DFS。所以我用DFS解一下。
这道题涉及了6个变量,我分别介绍一下:
n:就是目标美味程度。
num:用来记录当前的各个调料质量
ans:方案的总数
ans2:用来记录所有符合题意的每个方案的各个调料的质量
flag:当前操作的调料的编号
sum:实际的美味程度,也就是各调料质量之和
由于本题是输出格式是先输出方案的总数(ans)再输出的方案内具体各个调料的质量,所以要把每个符合的num整合到ans2中。
废话不多说,直接上代码讲解。
#include "iostream"
using namespace std;
int n,num[15],ans,ans2[60000][15];
void dfs(int flag,int sum){
if (flag>10){//如果对十个调料都操作过之后就要判断是否符合题意了
if (sum==n){//符合题意
ans++;//方案数加一
for(int i=1;i<=10;i++)ans2[ans][i]=num[i];//将num数组存入ans2中
}
return;//return掉
}
for(int i=1;i<=3;i++){对调料调料的质量进行遍历,每个调料有3个选择
if(sum+i>n)break;//如果调料质量之和加上当前调料的质量如果大于n也就没有必要继续往下了
num[flag]=i;//将当前操作的调料的质量记录到num中
dfs(flag+1,sum+i);//对下一个调料进行遍历操作
num[flag]=0;//回溯一下,可有可无,因为再次下次搜索时新的i会将旧的i值覆盖
}
}
int main(){
cin>>n;
dfs(1,0);
//dfs调用从第一个调料的质量开始操作
cout<<ans<<endl;
//最后输出ans和各个方案
for(int i=1;i<=ans;i++){
for(int j=1;j<=10;j++)cout<<ans2[i][j]<<" ";
cout<<endl;
}
}