P2089 烤鸡 - 洛谷
暴力递归: 3*10 不会超时
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<vector<int>> aa;
for(int i1=1;i1<=3;i1++)
for(int i2=1;i2<=3;i2++)
for(int i3=1;i3<=3;i3++)
for(int i4=1;i4<=3;i4++)
for(int i5=1;i5<=3;i5++)
for(int i6=1;i6<=3;i6++)
for(int i7=1;i7<=3;i7++)
for(int i8=1;i8<=3;i8++)
for(int i9=1;i9<=3;i9++)
for(int i10=1;i10<=3;i10++)
if(i1 + i2 + i3+i4+i5+i6+i7+i8+i9+i10 == n)
{
vector<int> t;
t.push_back(i1);
t.push_back(i2);
t.push_back(i3);
t.push_back(i4);
t.push_back(i5);
t.push_back(i6);
t.push_back(i7);
t.push_back(i8);
t.push_back(i9);
t.push_back(i10);
aa.push_back(t);
}
cout<<aa.size()<<endl;
for(int i=0;i<aa.size();i++){
for(int j=0;j<10;j++){
cout<<aa[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
暴力递归
答案条件: 10个数必须是1或2或3 , 所以i(计算加了多少个数) i==10 and sum==n 就记录一个答案。
数组t负责记录当前sum由那些数相加而得 , 所以每次递归完,要pop回溯
#include <bits/stdc++.h>
using namespace std;
int n;
int ans=0;
vector<vector<int>> res;
vector<int> t;
//暴力递归搜索
void dfs(int i,int sum)
{
if(i == 11)return ;
if(sum == n && i == 10)
{
ans++;
res.push_back(t);
}
t.push_back(1);
dfs(i+1,sum+1);
t.pop_back();
t.push_back(2);
dfs(i+1,sum+2);
t.pop_back();
t.push_back(3);
dfs(i+1,sum+3);
t.pop_back();
}
int main()
{
cin>>n;
vector<int> t;
dfs(0,0);
cout<<ans<<endl;
for(int i=0;i<ans;i++){
for(int j=0;j<10;j++){
cout<<res[i][j]<<" ";
}
cout<<endl;
}
return 0;
}