本文主要是介绍将一个数m分解成n个数之和的所有可能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
周末的时候,师兄提了一个小学生的题目,然后这个题目自我估计,反正我是做不出来的。然后师兄想用计算机的方法,写个代码看能不能把这个问题解答出来,于是就找了一下我这个菜鸡一起讨论(题目就不贴了,楼主感觉小学生过的好难啊),最后师兄表示他在一个问题上卡住了,简化之后问题是这样的:有n个数,他们之和为m,这些组合有多少种可能性,并将这些可能性列出来。用循环的话,这个鬼知道要套多少层循环,解决方案就是用递归(PS:递归真的是一个好东西,可是辣鸡楼主递归用得并不好)。参考了大佬的一个博客,修改了一下代码,得到了这个解决方案(递归这种东西,是真的要好好学呀!)。
照例,放上参考的大佬博客:https://blog.csdn.net/pp634077956/article/details/50058239
接下来是菜鸟自己写的对于这个问题的解决方案:
#include "iostream" #include "vector" #include "algorithm" using namespace std; vector<int>record; vector<vector<int>> result; void print() { for (auto it : record) cout << it << "\t"; cout << "\n===============================" << endl; } /*n是个数,m是总数,本函数的目的是得到n个数相加和为m的所有情况 考虑下来,可以采用递归的思想 */ void func(int n, int m) { static int index = 0; if (n == 2) { for (int i = 1; i < m; ++i) { record.push_back(i); record.push_back(m - i); result.push_back(record); cout << "case: " << ++index << endl; print(); record.pop_back(); record.pop_back(); } return; } for (int beg = 1; beg <= m -2 ; ++beg) { record.push_back(beg); func(n - 1, m - beg); record.pop_back(); } } int main() { func(3, 20); return 0; } |
采用的数据结构是vector,毕竟他可以好用啊。好了,以上短短的代码就能解决一个比较麻烦的循环嵌套问题,递归真是太好用了,不多说了,我要滚去学递归了。
这篇关于将一个数m分解成n个数之和的所有可能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!