某人准备跑20圈来锻炼自己的身体,他准备分多次(>1)跑完,每次都跑正整数圈,然后休息下再继续跑。 为了有效地提高自己的体能,他决定每次跑的圈数都必须比上次跑的多 设第一次圈数不能小于1,那么请问他可以有多少种跑完这 20 圈的方案? 输出方案总数,以及每种方案的排序。(比如1,19/ 1,2,17 都是有效方案
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int> > res;
vector<int > t;
int sum = 0;
int n = 20;
int cnt;
void dfs(int u, int st)
{
if(sum > n) return;
if(sum == n)
{
cnt ++;
res.push_back(t);
return;
}
for(int i = st; i < n; i ++)
{
t.push_back(i);
sum += t[u];
if(t.size() == 1)
{
dfs(u + 1, t.back() + 1);
}
else
{
dfs(u + 1, t[u] + 1);
}
sum -= t[u];
t.pop_back();
}
}
int main()
{
//t = vector<int>(n);
dfs(0, 1);
for(auto it:res)
{
for(int i = 0; i < it.size(); i ++) cout << it[i] << " ";
puts("");
}
cout << "cnt: " << cnt << endl;
}