洛谷 P2089 烤雞【DFS遞歸/10重枚舉】

【連接】: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 
【分析】:代碼註釋
【代碼】:
//深搜+剪枝,大量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; } }
無回溯遞歸
相關文章
相關標籤/搜索