您的位置:首页 > 其它

求1-n之间所有不重复的可能的值的和等于m的组合

2009-11-10 23:52 253 查看
求1-n之间所有不重复的可能的值的和等于m的所有组合

思路:

采用二叉树结构,根节点为岗哨,无实际意义,从根节点开始,其左孩子节点表示选中1,有孩子节点表示不选中1,以此类推。

从根节点开始遍历,若此节点的sum< M,则递归调用此节点,若sum>M,则return,若sum=M,则回溯所有的节点。

具体代码如下:

#include <stdio.h>
#include <malloc.h>
#define M 10
#define N 10
typedef int ElemType;
typedef struct Node
{
ElemType sum; //到此节点时的所有节点值的和
ElemType level;//此节点位于第几层
struct Node *lchild;
struct Node *rchild;
struct Node *parent;
}Node,*LinkList;

//回溯此节点直到root

void reverseVisit(Node *node)
{
Node *tmp;
printf("%d+",node->level);
tmp = node ->parent;
while(tmp!=NULL)
{
if (tmp->parent != NULL && tmp->parent->lchild == tmp)
printf("%d+",tmp->level);
tmp = tmp->parent;
}
printf("\n");
}

//本程序的核心

void visitTree(Node *root)
{
Node *l,*r;
if(root->sum > M || root->level > N)
return;
if(root->sum < M)
{
l=(LinkList)malloc(sizeof(Node));
l->level = root->level+1;
l->sum=l->level + root->sum;
l->lchild=NULL;
l->rchild = NULL;
l->parent = root;
r=(LinkList)malloc(sizeof(Node));
r->level = root->level+1;
r->sum= root->sum;
r->lchild=NULL;
r->rchild = NULL;
r->parent = root;

root->lchild = l;
root->rchild = r;
visitTree(l);
visitTree(r);
}
if(root->sum==M)
{
reverseVisit(root);
}
}

int main(void)
{
Node *root=(LinkList)malloc(sizeof(Node));
root->level = 0;
root->sum=0;
root->lchild=NULL;
root->rchild = NULL;
root->parent = NULL;
visitTree(root);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐