P2089 烤鸡 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题锻炼了递归枚举的运用,难点是需要储存每个方案。
代码如下:
#include <iostream>
using namespace std;
int n, kind = 0, m[60000][12], track[12];//数组习惯性开大一点以免RE
void dfs(int sum, int u)
{
if (u == 10)
{
if (sum == n)
{
for (int i = 0; i < 10; i++) m[kind][i] = track[i];//记录每种情况的各个方案
kind++;
}
return;
}
else if (sum >= n) return;
else
{
for (int i = 1; i <= 3; i++)
{
track[u] = i;
dfs(sum + i, u + 1);
}
}
}
int main()
{
cin >> n;
if (n > 30) cout << "0"; //大于30肯定不合法
else
{
dfs(0, 0);
cout << kind << endl;
for (int i = 0; i < kind; i++)
{
for (int j = 0; j < 10; j++)
cout << m[i][j] << " ";
cout << endl;
}
return 0;
}
}
洛谷题解里的一个代码,挺好的,可以反向更好的理解递归
#include<iostream>
using namespace std;
int main()
{
int a,b,c,d,e,f,g,h,i,j,in,x=0;
cin>>in;
for (a=1;a<=3;a++)
{
for (b=1;b<=3;b++)
{
for (c=1;c<=3;c++)
{
for (d=1;d<=3;d++)
{
for (e=1;e<=3;e++)
{
for (f=1;f<=3;f++)
{
for (g=1;g<=3;g++)
{
for(h=1;h<=3;h++)
{
for (i=1;i<=3;i++)
{
for (j=1;j<=3;j++)
{
if (a+b+c+d+e+f+g+h+i+j==in)
{
x++;
}
}
}
}
}
}
}
}
}
}
}
cout<<x<<endl;
for (a=1;a<=3;a++)
{
for (b=1;b<=3;b++)
{
for (c=1;c<=3;c++)
{
for (d=1;d<=3;d++)
{
for (e=1;e<=3;e++)
{
for (f=1;f<=3;f++)
{
for (g=1;g<=3;g++)
{
for(h=1;h<=3;h++)
{
for (i=1;i<=3;i++)
{
for (j=1;j<=3;j++)
{
if (a+b+c+d+e+f+g+h+i+j==in)
{
cout<<a<<" ";
cout<<b<<" ";
cout<<c<<" ";
cout<<d<<" ";
cout<<e<<" ";
cout<<f<<" ";
cout<<g<<" ";
cout<<h<<" ";
cout<<i<<" ";
cout<<j<<endl;
}
}
}
}
}
}
}
}
}
}
}
}