一個集合x有都不相同的n個元素,使用這個集合中的不定個數的元素,組成一個和為s的序列,求出所有符合的序列,元素可以重復使用,只要元素的個數相同不考慮順序。
比如集合是x={2,3,4,5,7}; n=5, s=12可以得出以下的序列:
2 2 2 2 2 2
2 2 2 2 4
2 2 2 3 3
2 2 3 5
2 2 4 4
2 3 3 4
2 3 7
2 5 5
3 3 3 3
3 4 5
4 4 4
5 7
#include <iostream> #include <vector> using namespace std; int PushVector(int *x,int n,int s,vector<int> &tablelist,int Position) { if(s<0) { tablelist.clear(); return 0; } else if(s==0) { for(int i=0;i<tablelist.size();i++) { cout<<tablelist[i]<<"\t"; } cout<<"\n"; return 0; } else if(s>0) { for(int i=Position;i<n;i++) { vector<int> newtablelist; for (int j=0;j<tablelist.size();j++) { newtablelist.push_back(tablelist[j]); } newtablelist.push_back(x[i]); int news = s-x[i]; //cout<<i<<","<<news<<"\n"; PushVector(x,n,news,newtablelist,i); } } else { } return 0; } /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int FindResult(int * x,int n,int s) { vector<int> tablelist; tablelist.clear(); PushVector(x,n,s,tablelist,0); return 0; } int main(int argc, char** argv) { int x[]= {2,3,4,5,7}; int n =5; int s=12; FindResult(x,n,s); system("pause"); return 0; } #include <iostream> #include <vector> using namespace std; int PushVector(int *x,int n,int s,vector<int> &tablelist,int Position) { if(s<0) { tablelist.clear(); return 0; } else if(s==0) { for(int i=0;i<tablelist.size();i++) { cout<<tablelist[i]<<"\t"; } cout<<"\n"; return 0; } else if(s>0) { for(int i=Position;i<n;i++) { vector<int> newtablelist; for (int j=0;j<tablelist.size();j++) { newtablelist.push_back(tablelist[j]); } newtablelist.push_back(x[i]); int news = s-x[i]; //cout<<i<<","<<news<<"\n"; PushVector(x,n,news,newtablelist,i); } } else { } return 0; } /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int FindResult(int * x,int n,int s) { vector<int> tablelist; tablelist.clear(); PushVector(x,n,s,tablelist,0); return 0; } int main(int argc, char** argv) { int x[]= {2,3,4,5,7}; int n =5; int s=12; FindResult(x,n,s); system("pause"); return 0; }