【連接】:https://www.luogu.org/problemnew/show/P2089c++
題目描述
豬豬Hanke特別喜歡吃烤雞(本是同畜牲,相煎何太急!)Hanke吃雞很特別,爲何特別呢?由於他有10種配料(芥末、孜然等),每種配料能夠放1—3克,任意烤雞的美味程度爲全部配料質量之和ide
如今,Hanke想要知道,若是給你一個美味程度,請輸出這10種配料的全部搭配方案spa
輸入輸出格式
輸入格式:code
一行,n<=5000blog
輸出格式:遞歸
第一行,方案總數ci
第二行至結束,10個數,表示每種配料所放的質量it
按字典序排列。io
若是沒有符合要求的方法,就只要在第一行輸出一個「0」for循環
輸入輸出樣例
輸入樣例#1:
複製
11
輸出樣例#1:
複製
無回溯遞歸
10 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1
【分析】:代碼註釋
【代碼】:
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
//深搜+剪枝,大量for循環存在時,就能夠用遞歸表示。 /* DFS搜索大法強吼!!從第一種配料開始枚舉,直至到第十種, 每一種配料可能的取值有3種,分別爲1,2,3。套用DFS模板便可解決。 */ #include<bits/stdc++.h> using namespace std; int n; int kind,ans[10000][10],a[10]; void dfs(int total,int cur) //全部配料質量之和,當前放入配料種數的盒子 { if(cur==10) //剛好10個盒子都放了配料 { if(total==n) //烤雞的美味程度爲全部配料質量之和 { for(int j=0;j<10;j++) ans[kind][j]=a[j]; kind++; //合法則搭配方案++,這條必須放在後面 } } else{ for(int i=1;i<=3;i++) //每種配料能夠放1—3克 { a[cur]=i; //i克配料放入第cur個盒子 dfs(total+i,cur+1); //至關於10重循環 } } } int main() { cin>>n; dfs(0,0); cout<<kind<<endl; for(int i=0;i<kind;i++) { for(int j=0;j<10;j++) cout<<ans[i][j]<<" "; cout<<endl; } }