【题目】输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m,要求将其中所有的可能组合列出来. 【思路】回溯法,从n往前取相应的值。 【代码】 //By proing [http://blog.csdn.net/proing] #include "stdafx.h" #include <iostream> #include <math.h> #include <list> using namespace std; static list<int> mylist; void AllPossibleValue(int n,int sum) { if(sum > n*(n+1)/2 || n<1 || sum <1) return; bool tag=true; if(sum > n) { mylist.push_front(n); AllPossibleValue(n-1,sum-n); mylist.pop_front(); AllPossibleValue(n-1,sum); tag = false; } else { cout <<sum; for(list<int>::iterator it = mylist.begin();it !=mylist.end();++it) cout<<" " << *it; cout<<endl; for(int i =0;tag && i<sum;i++) { AllPossibleValue(sum-1-i,sum); tag=false; } } } void main(int argc, _TCHAR* argv[]) { AllPossibleValue(6,9); cout <<endl<<endl; AllPossibleValue(6,5); cout <<endl; AllPossibleValue(6,6); return ; }