数组部分之和问题
来源:互联网 发布:手机上录歌的软件 编辑:程序博客网 时间: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;}
- 数组部分之和问题
- 数组部分之和问题
- 数组部分之和问题
- 两个数组之和的问题
- [算法]子数组之和问题
- 数组之和
- 《Java面试试题》找出前半部分数组和后半部分数组之和相同的索引
- LeetCode 题目之 数组两数之和问题
- 求最大子数组之和及其一些扩展问题
- 子数组之和
- 最大子数组之和
- 最大子数组之和
- 最大子数组之和
- 子数组之和
- 子数组之和
- 题目:子数组之和
- 二维数组之和
- 题目:子数组之和
- #define and typedef
- 支持不同屏幕——Supporting Different Screens
- Android获取系统语言
- JavaScript window.setTimeout() 的详细用法
- Linux MySQL主从复制(Replication)(MySQL数据同步)配置
- 数组部分之和问题
- Linux下 Eclipse Standard 4.3.x Kepler 的安装 + 汉化方法(官方最新地址)+还原英文 总结
- linux系统编程之信号(一):中断与信号
- set,multiset容器类型
- 使用 Rotate Master 实现MySQL 多主复制
- ifconfig command not found
- tcpdump命令
- 【Centos5.x】Samba 3.x服务器预览
- 判断JSon是否为空