在一个C语言群看到有人问问题,图:
于是乎想起了以前做过一个类似的算法题,http://blog.csdn.net/qq_21049875/article/details/77849257,还没写完,不过也不想补坑了(懒),因为在看到这个问题的例如,突然想到了一种方法去解决类似的问题,也就是这道题我的解决思想,也有些dfs的感觉。
想法:数分为类似于第一个结果{5,1,1,1}然后我们就根据这个结果去推导后面的结果,设定类似于指针的head与end,head=ary[0],end=ary[1],如上便是*head=5,*end=1,通过运算,得到*head=4,*end=2,*head=3,*end=3,则两组结果,然后就移动head与end的位置(head++,end++),直到最后两位,也就到了{3,2,2,1},head=2,end=1,则head回溯(head–),找到3,然后head=2,end=2就得到{2,2,2,2}最后一个数列,除此之外,还要考虑{4,2,2}类似的情况(在测试n=3,m=8的找到的问题)
代码:
vector<vector<int>> divsl(int n,int m)
{
if (n > m)
{
cout << "error" << endl;
exit(0);
}
vector<int>ary;
vector<vector<int>>m_ary;
int s = m - n + 1;
ary.push_back(s);
for (int i = 1; i < n; i++)
{
ary.push_back(1);
}
m_ary.push_back(ary);
int head = 0, end = 1;//依靠head与end找出要+1的数
while (end<n&&head>=0)
{
if ((ary[head] - 1) > ary[end])
{
ary[head] = ary[head] - 1;
ary[end] = ary[end] + 1;
m_ary.push_back(ary);
}
else if (ary[head] == ary[end]&&end<n-1)
{
head++;
end++;
}
else if (ary[head] == ary[end]&&end==n-1)
{
head--;
end--;
}
else if (ary[head] == ary[end] + 1&&end<n-1)
{
head++;
end++;
}
else if (ary[head] == ary[end] + 1 && end == n - 1)
{
head--;
}
}
return m_ary;
}
int main()
{
auto temp = divsl(4, 8);
for (auto i : temp)
{
for (auto j : i)
{
cout << j << " ";
}
cout << endl;
}
return 0;
}
m=8,n=4的结果:
m=8,n=3的结果: