数组部分之和问题

来源:互联网 发布:手机上录歌的软件 编辑:程序博客网 时间:2024/06/06 04:25

一个集合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;}
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include <memory.h>#define _DEBUG 1#define MAXM 20#define MAXN 10int arr[MAXN];//数数组bool path[MAXN][MAXM+1];//路线bool hashtable[MAXM+1];//是否存在int c;//记录打印队列大小int v[MAXM+1];//打印队列,数组大小最大为MAXN+1,此时每个数为1void printPath(int i,int j,int c){if(path[i][j] &&j-arr[i]==0){//第一个点printf("%d ",arr[i]);for(int t=c-1;t>0;t--){printf("%d ",v[t]);}printf("%d\n",v[0]);return;}assert(path[i][j]);v[c++]=arr[i];//将元素加入到打印队列中for(int k=1;k<=i;k++){if(path[k][j-arr[i]])printPath(k,j-arr[i],c);}c--;//将元素从打印队列中删除}void solve(int size,int m){//size表示数组的大小,从1开始int i,j;//初始化memset(path,false,sizeof(path));hashtable[0]=true;for(i=1;i<=size;i++){for(j=arr[i];j<=m;j++){if(hashtable[j-arr[i]]){hashtable[j]=true;path[i][j]=true;}}}for(i=1;i<=size;i++){if(path[i][m]){printPath(i,m,0);}}}int main(){#if _DEBUG==1freopen("interview.in","r",stdin);#endifint n,m;int i,j;scanf("%d %d",&n,&m);for(i=1;i<=n;i++){scanf("%d",&arr[i]);}solve(n,m);return 0;}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我尝到了母爱的甜蜜400 真实母教子视频 我尝到了母亲的滋味400 我尝到了母爱的滋味450 单亲家庭母教子 啊儿子深点妈要来了中文字 美国真实的母教子视频 儿子别 停妈还要中文字 尝到了母爱的滋味400 让儿子尝试了一次中文字 我尝到了母爱的滋味40 我尝到了母爱的滋味400小说下载 好胀胀死妈了乖乖儿子中文字 我尝到了母爱的滋味300 儿子别射J去妈会怀孕视频中文 全屏儿子射J去妈怀孕了漫画 全屏无遮单身妈和儿 四川真实亲妈视频y 全屏无遮单身妈和儿子漫画 全屏无遮单身妈和儿子线播放 青岛重庆真实儿子亲妈 全屏无遮单身在线播放 四川真实亲妈视频链接 全屏无遮单身妈和儿子在线播放中文字 白边液越用白边越大 四川亲妈真实视频 普通话对白边电话边看边干 浙江边干边对白边对白边对白 离婚后一直跟儿子做 边骂脏话对白 离婚多年生理需求和儿子 儿子很帅没忍住和他 离婚后跟儿子做 和儿子一起旅游没忍住 离婚很多年和儿子一起 怀孕了、是儿子的 子母相伦动漫视频 离婚多年和儿子一起打工住一起没忍住 双子母视频 视频播放 与岳 母坐摩托车txt小说 我的丝母韵母txt