zoukankan      html  css  js  c++  java
  • 子集和数问题

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

    运行结果:

     

     

  • 相关阅读:
    中位数相关
    带权并查集
    组合数相关、多重集组合数
    LIS最长上升子序列
    提高你css技能的css开发技巧
    如何让搜索引擎抓取AJAX内容?
    Javascript异步编程的4种方法
    前端自动化构建工具gulp
    前端自动化构建工具
    git使用
  • 原文地址:https://www.cnblogs.com/liao-pxsoftware15/p/8138242.html
Copyright © 2011-2022 走看看