求大神帮我看看我写的这个《算法导论》里面动态规划里的计划公司聚会的那段代码为什么运行不出来呢~!~!

leonardodora 2012-06-07 08:10:30
啊!痛苦死啦~!!不知道是哪里错了~!求帮助啊!!
这个代码编译能通过,但是运行不出来。题目是这样的:


Stewart教授是一家公司总裁的顾问,这家公司计划一个公司聚会。这个公司有一个层次式的结构;也就是说,管理关系形成一棵以总裁为根的树。人事部给每个雇员以喜欢聚会的程度来排名,这是个实数。为了使每个参加者都喜欢这个聚会,总裁不希望一个雇员和他(她)的直接上司同时参加。
Stewart教授面对一棵描述公司结构的树,使用了左子女、右兄弟表示法。树中每个结点除了包含指针,还包含雇员的名字和该雇员喜欢聚会的排名。描述一个算法,它生成一张客人列表,使得客人喜欢聚会的程度的总和最大。分析你的算法的执行时间。

我的代码是:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define N 10
int mm=0;
int nn=0;


typedef struct Node
{
int ID;
struct Node *left; //左孩子
struct Node *right; //右兄弟
struct Node *father; // 父节点
int howMuch; // 喜欢聚会的程度
int go; // 如果去的喜欢程度
int notgo; //如果不去的喜欢程度
int decide; //0表示不去,1表示去
int lavel; //职位(即层数总裁为0,依次类推)
}Party;


void rand(Party party[],int num) //产生随机层和随机喜欢程度数
{
int j=0;
party[0].lavel=0;
int n;
srand(time(NULL)); //产生随机种子
n=rand()%9+1; //喜欢程度为0到9
cout<<"ID:0层数为0"<<";喜欢程度数为"<<n<<endl;
for(int i=1;i <num;i++)
{

party[i].ID=i;


if(rand()%2==1) //保证如果i>j,则i的层数大于等于j的层数
{
j++;
}
party[i].lavel=j;


party[i].howMuch=rand()%9+1;
cout<<"ID:"<<i<<"层数为"<<j<<";喜欢程度数为"<<party[i].howMuch<<endl;
}
}





Party* InitTree(Party party[],int n) //构造“左孩子右兄弟二叉树”
{
int lavel=0;
int i;
Party *root=&party[0];
Party *pre=root;
Party *cur;
Party *newNode=NULL;
root->father=NULL;
for(i=1;i <n;)
{
lavel=party[i].lavel;
cur=&party[i];
while(party[i].lavel==lavel&&i <n)
{
newNode->ID=party[i].ID;
newNode->lavel=party[i].lavel;
newNode->howMuch=party[i].howMuch;
if((pre->left)==NULL)
{
pre-> left=newNode;
cur=pre->left;
}
else
{
cur-> right=newNode;
cur=newNode;
}
party[i].father=pre;
i++;
}
pre=pre->left;
}
return root;
}




int Compute(Party * party) //计算这个以party为根的所有节点的去和不去的喜欢程度总和,
{ //这是运用动态规划算法的核心代码

Party *node;
Party *j;
if(party->left==NULL) //如果没有孩子节点
{
party->notgo=0;
party->go=party->howMuch;
return 0;
}


else //有孩子节点
{
Compute(party->left); //计算第一个左孩子节点最大喜欢程度(包括去和不去)。
mm+=party->left->howMuch; //mm代表第一个左孩子去的最大喜欢程度
nn+=party->left->notgo>=party->left->go?party->left->notgo:party->left->go; //nn代表第一个左孩子不去的最大喜欢程度


if(party->left->right!=NULL) //依次计算party的其他孩子节点的最大喜欢程度的情况
{
node=party->left->right;
for(j=node;j!=NULL;j=j->right)
{
Compute(j);
mm+=j->howMuch;
nn+=j->notgo>=j->go?j->notgo:j->go;
}
}

party->go=party->howMuch+mm;
party->notgo=nn;
return ((party->howMuch+mm)>nn?(party->howMuch+mm):nn);
}
}



void Decide(Party *party) //决定以party为跟的所有节点去和不去的情况
{
Party *node=NULL;
Party *i=NULL;
Party *parent=party->father; //parent是party的父节点
if(parent==NULL)
{
party->decide=party->go>party->notgo?1:0;

}

else
{
if(parent->decide==1) //如果上司去,则party则不去
party->decide=0;

else //如果上司不去,则判断party去好还是不去好。
party->decide=party->notgo>party->go?0:1;
}


if(party->left!=NULL) //计算以party的子节点为根的去和不去情况
{
Decide(party->left);
node=party->left->right;

if(node!=NULL)
{
for(i=node;i!=NULL;i=i->right)
Decide(i);
}
}
}




int main()
{
int i;
Party *root;
Party* party[N];
for(i=0;i<N;i++)
party[i]=(Party *)malloc(sizeof(Party));
rand(*party,N);
root=party[0];
InitTree(*party,N);
i=Compute(root);
Decide(root);
for(i=0;i<N;i++)
{
if(party[i]->decide==1)
cout<<"ID"<<i<<"去";
else
cout<<"ID"<<i<<"不去";
}
cout<<"一共喜欢聚会的程度为"<<i;
system( "pause ");
return 0;
}
...全文
55 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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