第一次做:2020年2月23日1小时58分钟
没有任何思路,看到题解才知道可以用10层循环的暴力枚举或者深搜
解法一:暴力枚举
#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;
}
}
}
}
}
}
}
}
}
}
}
}
解法二:裸深搜
#include<iostream>
#include<cstdio>
using namespace std;
int n,ans1,ans2[10001][11],sum,a[11];
void trys(int t,int m)//t代表当前的尝试的调料。m代表当前美味程度
{
if (t>10)
{
if (m==n) //如果美味程度与猪猪的要求相等
{
ans1++;//统计方案总数
for (int i=1;i<=10;i++)
ans2[ans1][i]=a[i];//存入答案的数组
}
return ;
}
for (int i=1;i<=3;i++)
{
if (m+i>n) break;//如果超过了要求,那么后面的就可以直接忽略
a[t]=i;//储存答案
trys(t+1,m+i);//查看下一种调料
a[t]=0;//状态恢复
}
}
int main()
{
cin>>n;
trys(1,0);//从第一种调料开始尝试,美味程度为0
cout<<ans1<<endl;
for (int i=1;i<=ans1;i++)
{
for (int j=1;j<=10;j++)
cout<<ans2[i][j]<<" ";
cout<<endl;
}//输出结果
return 0;
}
我模仿代码二的尝试
#include <iostream>
using namespace std;
int n;
int num;
int ans[10000][11]; // 疑问一: 为什么开到10000???
int temp[11];
void dfs(int pei, int del) {
if (pei > 10) {
if (del == n) {
for (int i = 1; i <= 10; ++i) {
ans[num][i] = temp[i];
}
++num;
}
return ; // 这里注意递归终点必须返回,不要多加 else
}
for (int i = 1; i <= 3; ++i) {
if(del + i > n)
break;
temp[pei] = i;
dfs(pei + 1, del + i);
temp[pei] = 0; // 疑问二: 不设置0也可以
}
}
int main() {
cin >> n;
dfs (1, 0);
cout << num << endl;
for (int i = 0; i < num; ++i) {
for (int j = 1; j <= 9; ++j) {
cout << ans[i][j] << " ";
}
cout << ans[i][10] << endl;
}
return 0;
}