上一篇是几乎用的别人的方法,我想了下,那样的排版太难看了,而且他是从n开始往前开始动态规划,
所以我就想从前开始往后开始动态规划求出sum的组合元素,这样得出的结果更有层次,思想差不多,
废话不多说,直接上代码:
#include<iostream>
#include<list>
using namespace std;
list<int> factorlist;
void FindFactorDP(int n,int sum,int result,int boundry)
{
if(sum <= 0 || n > boundry)
return;
if(sum == n)
{
factorlist.reverse();
for(list<int>::iterator iter = factorlist.begin();iter != factorlist.end();iter++)
{
cout<<*iter<<" + ";
}
cout<<n<<" = "<<result<<endl;
factorlist.reverse();
}
factorlist.push_front(n);
FindFactorDP(n + 1,sum - n,result,boundry); //典型的01背包问题
factorlist.pop_front(); //放n,n+ 1 ~ boundry填满sum-n
FindFactorDP(n + 1,sum,result,boundry); //不放n,n+ 1 ~ boundry填满sum-n
}
int main()
{
int sum, n;
cout << "请输入你要等于多少的数值sum:" << endl;
cin >> sum;
cout << "请输入你要从1.....n数列中取值的n:" << endl;
cin >> n;
cout << "所有可能的序列,如下:" << endl;
FindFactorDP(1,sum,sum,n);
return 0;
}