#include <iostream> using namespace std; int x[100]; void SumofSub(int s,int k,int r,int M,int *w) { x[k]=1; if(s+w[k]==M) //如果等于M,那么输出结果 { cout<<"子集为:"; for(int i=0;i<=k;i++) if(x[i]==1) cout<<w[i]<<" "; // cout<<x[i]<<" ("<<w[i]<<")"<<endl; cout<<endl; } else if(s+w[k]+w[k+1]<=M) //如果往后加两个元素,依然<=M,则将当前第k个元素加入s,k取下一个元素,继续递归 { SumofSub(s+w[k],k+1,r-w[k],M,w); } if( (s+r-w[k])>=M && (s+w[k+1])<=M ) //如果不包括w[k]时,全体元素>=M,并且s加上下一个元素的和<=M,则舍弃当前第k个元素,选择下一个元素 { x[k]=0; SumofSub(s,k+1,r-w[k],M,w); } } //快速排序 void swap(int &a,int &b) { int temp = a; a = b; b = temp; } int partition(int *w,int p,int r) { int i=p-1; int j=p; for(j=p;j<r;j++) { if(w[j]<=w[r]) { i++; swap(w[i],w[j]); } } swap(w[i+1],w[r]); return i+1; } void QuickSort(int *w,int p,int r) { int q; if(p<r) { q = partition(w,p,r); QuickSort(w,p,q-1); QuickSort(w,q+1,r); } } int main() { int n,sum=0,M; cout<<"输入元素个数:"<<endl; cin>>n; cout<<"请输入"<<n<<"个元素的值:"<<endl; int *w = new int[n]; for(int i=0;i<n;i++) { cin>>w[i]; sum+=w[i]; } cout<<"请输入要匹配的和的大小M:"<<endl; cin>>M; QuickSort(w,0,n-1); SumofSub(0,0,sum,M,w); return 0; }
运行结果: