一道非常经典的递归题
主要是要注意题目里的条件,调料在1~3克,在递归每一种时,就是1,2,3,然后要注意退出条件,到最后一种调料时,要退出,确保没有重复
#include<iostream>
using namespace std;
int ans,n,a[11],b[1000000][11];
void dfs(int sum,int x)
{
if(x==11) //当到达最后一个的时候
{ //这两个条件不能并在一起,因为当x=11时要退出程序无论到没到n 否则将会有重复
if(sum==n) //恰好等于目标
{
ans ++;
for(int i=1;i<=10;i++)
b[ans][i] = a[i]; //保存情况
return;
}
return ;
}
else if(sum>=n) return; //最好写上else 不写的话就要写return 大于n一定不符合情况 退出
else for(int i=1;i<=3;i++)
{
a[x] = i;
dfs(sum+i,x+1); //递归下一个
}
}
int main()
{
cin>>n;
dfs(0,1);
cout<<ans<<endl;
for(int i=1;i<=ans;i++)
{
for(int j=1;j<=10;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
return 0;
}
感觉不是很难,但是当时写没看清条件,写的递归超时了,感觉应该也有重复的,这个退出条件但是看了好久也不知道错在哪,不能考虑漏了情况,希望下次能写出来。