64,654
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<string.h>
using namespace std;
int sum=0,j=0;
int d[100];//这个数组是用来存储合适的数 如果暂时合适就放进去
int print(int a[],int n);
int digui(int a[][2],int num,int n);
int main()
{
int ch[100][2];
int n;
memset(d,0,sizeof(d));
cin>>n;//n的意思是有N个数
int num;//num就是要找到的那个总和数
cin>>num;
for(int i=0;i<n;i++)//为了简单,现在我用循环来产生着N个数
{
ch[i][1]=(i+1)*10;
ch[i][0]=0;//这里是表示这个数没有被用过 如果用过了以后我就把这个值变成1现在初始化是0
}
digui(ch,num,n);
return 1;
}
int print(int a[],int n)//如果找到了正确的答案,就调用这个函数打印出来
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 1;
}
int digui(int a[][2],int num,int n)
{
for(int i=0;i<n;i++)
{
if(a[i][0]==0)//如果没有被用过 那么进去
{
if(sum+a[i][1]==num)//如果刚好是要找到的那组解……
{
d[j]=a[i][1];
a[i][0]=1;
j++;
print(d,j);
return 1;
}
else if(sum+a[i][1]>num)//如果不是 总和已经大于我要找的数……
{
a[i][0]=0;
d[j]=0;
j--;
return 0;
}
else //如果是部分解那么就执行递归 往后找
{
d[j]=a[i][1];
a[i][0]=1;
j++;
sum+=a[i][1];
digui(a,num,n);
}
}
}
return 1;
}
//求从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();
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/************************************************************************/
/* 递归 */
/************************************************************************/
void getResult(int a[],int size,int N,int res[],int resSize)
{
if (size==1)
{
if(N==a[0])
{
for (int j=0;j<resSize;j++)
{
cout<<res[j]<<" ";
}
cout<<a[0];
cout<<endl;
}
return;
}
if(N==a[0])
{
for (int j=0;j<resSize;j++)
{
cout<<res[j]<<" ";
}
cout<<a[0];
cout<<endl;
}
res[resSize++] = a[0];
getResult(&a[1],size-1,N-a[0],res,resSize);
resSize--;
getResult(&a[1],size-1,N,res,resSize);
}
/************************************************************************/
/* 非递归 */
/************************************************************************/
void getResult(int a[],int size,int N)
{
vector<int> iv;
vector<int> indexv;
int back=0;
int sum=0;
while (back<size)
{
int front = back;
while (front!=size)
{
if (sum+a[front]<N)
{
iv.push_back(a[front]);
indexv.push_back(front);
sum+=a[front];
}
else if (sum+a[front]==N)
{
for (vector<int>::const_iterator it = iv.begin();it!=iv.end();it++)
{
cout<<*it<<" ";
}
cout<<a[front]<<endl;
if (iv.empty())
{
break;
}
sum-=iv.back();
iv.pop_back();
front = indexv.back();
indexv.pop_back();
if (iv.empty())
{
break;
}
}
else
{
sum-=iv.back();
iv.pop_back();
front = indexv.back();
indexv.pop_back();
if (iv.empty())
{
break;
}
}
front++;
}
sum = 0;
iv.clear();
indexv.clear();
back++;
}
}
void main()
{
int a[] = {1,1,3,5,8,9,1,10,13};
int b[sizeof(a)/sizeof(int)];
int N = 13;
sort(a,a+sizeof(a)/sizeof(int));
getResult(a,sizeof(a)/sizeof(int),13,b,0);
getResult(a,sizeof(a)/sizeof(int),13);
}