子集和数问题

#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;

}

运行结果:

 

 

原文地址:https://www.cnblogs.com/liao-pxsoftware15/p/8138242.html