1个数组元素为1-15 输出所有和为15的情况

brk1985 2010-10-26 04:39:48
1个数组,元素为1-15,输出所有和为15的情况,如 1+4+10、5+10、15等;

/*我的思路是先找两个数和为15,比如1+14,把1、14放到临时向量里,入栈;再把14进行分解,按前面思路,递归;*/
如何在我下面程序进行修改,支持这个输出结果?在递归函数试了放一重循环,又发现没了两重循环的好处;放两重循环,似乎又不行;求助各位高手,能否按照我这个思路给个解决方案?当然有更好的方法也可以贴出来。。。


#include <iostream>
#include <vector>
#include <stack>
using namespace std;

stack<vector<int>> S1;//可以用队列,存储工具
vector<int> Vtemp;
vector<int> V2;
int sum = 15;//和为15

void addN(vector<int> V1, int sum){//N个数相加:2个数相加、3个数相加......
int V1size = V1.size();
for(int i=0; i<V1size/2; i++){//前一半,防止重复,避免输出1、14;14、1这种情况
for(int j=V1size-1; j>=V1size/2; j--){//后一半
if(V1[i]+V1[j]==sum && V1[i]!=V1[j]){
Vtemp.clear();//入栈前清空临时向量
Vtemp.push_back(V1[i]);
Vtemp.push_back(V1[j]);
S1.push(Vtemp);//输出1、14这种情况
//下面几个语句是我为了做递归写的,有问题
V2.clear();
for(int d=1; d<=j; d++){
V2.push_back(d);//构造V2,求Vtemp中的两个元素之和为V1[j],即分解V1[j],输出1、6、8这种情况
}
addN(V2, V1[j]);//求Vtemp中的两个元素之和为V1[j],这样做发现V1[i]无法入栈,只能输出2个???
}
}
}
}

void main()
{
vector<int> V1;
Vtemp.clear();
//list<vector<int>> L1;
for(int d=1; d<=15; d++){
V1.push_back(d);
}
//int V1size = V1.size();
for(int i=0; i<V1.size(); i++){
cout<< V1[i] <<" ";
}
cout<<endl;

addN(V1, 15);
while(!S1.empty()){//输出栈中和为15的各种情况
Vtemp.clear();
Vtemp = S1.top();
S1.pop();
for(int i=0; i<Vtemp.size(); i++)
cout<< Vtemp[i]<< " ";
cout<< endl;
}
}
...全文
226 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
brk1985 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dskit 的回复:]

求一个集合的全子集问题,这个问题的复杂度是指数级的,但是可以根据和为15进行剪枝。
[/Quote]

能否讲的具体点。。。不太明白。。。
brk1985 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhao4zhong1 的回复:]

仅供参考C/C++ code
//求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案
#include <stdio.h>
#include <conio.h>
int Begin,End,Sum;
int j;
int o[1000];
long n;
void combsum(int b,int e,int s,int d) {
int i;

if (……
[/Quote]

你这个程序和我的思路基本上一致,程序代码简洁有效。。。但是有点难呀,想不到可以这样设计函数参数,函数参数d蛮绝的。。。如果把函数参数确定了,这样的程序填空题倒是有可能做的出来。。。
赵4老师 2010-10-26
  • 打赏
  • 举报
回复
仅供参考
//求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案
#include <stdio.h>
#include <conio.h>
int Begin,End,Sum;
int j;
int o[1000];
long n;
void combsum(int b,int e,int s,int d) {
int i;

if (e>s) e=s;
for (i=e;i>=b;i--) {
if ((i+b)*(i-b+1)/2<s) break;
o[d]=i;
if (s-i<=0) {
n++;
printf("%8ld:",n);
for (j=0;j<=d;j++) printf("%d ",o[j]);
printf("\n");
} else {
if (d+1<1000) combsum(b,i-1,s-i,d+1);
else {
printf("Error:Too deep.\n");
return;
}
}
}
}
void main() {
clrscr();
printf("Input Begin,End,Sum:");
scanf("%d,%d,%d",&Begin,&End,&Sum);
n=0L;
combsum(Begin,End,Sum,0);
printf("Total:%ld\n",n);
getch();
}
xiaohouzi510 2010-10-26
  • 打赏
  • 举报
回复
好东西,学习
ocean1004 2010-10-26
  • 打赏
  • 举报
回复
可行的吧?如果元素不能被重复使用。
ma100 2010-10-26
  • 打赏
  • 举报
回复
则所有组合
0 0 0 ... 1 ~~~~~~~~~~1
0 0 0 .. 1 0 ~~~~~~~~~~2
...
1 1 1 .. 1 ~~~~~~~~~~~2^15-1
ma100 2010-10-26
  • 打赏
  • 举报
回复
复杂度好像2的15次方,
把15个数看成
1 2 3 ... 15
则所有组合
0 0 0 ... 1 1
0 0 0 .. 1 0 2
...
1 1 1 .. 1 2^15-1
sichuanwww 2010-10-26
  • 打赏
  • 举报
回复
组合数学有介绍。
dskit 2010-10-26
  • 打赏
  • 举报
回复
求一个集合的全子集问题,这个问题的复杂度是指数级的,但是可以根据和为15进行剪枝。
ouyh12345 2010-10-26
  • 打赏
  • 举报
回复
这个思路不对,会有很多重复的

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧