求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;
}
思路:
采用二叉树结构,根节点为岗哨,无实际意义,从根节点开始,其左孩子节点表示选中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;
}
相关文章推荐
- 递归列举从数组b()中选出某些元素(允许重复)使其和等于num的所有组合
- 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n和m,从数列1,2,3....n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来
- 输入两个整数n和m,从数列1,2.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 输入两个整数n和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m,要求将其中所有的可能组合列出来。
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 21.输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
- 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。实际上就是一个背包问题
- 输入两个正整数n和m,从数列1,2,3.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来.编程求解
- 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解) .
- 第21 题 2010 年中兴面试题 编程求解: 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来.
- 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数,使其和等于m ,要求将其中所有的可能组合列出来.