64,681
社区成员
发帖
与我相关
我的任务
分享
#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;
}
}
//求从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();
}