好房网

网站首页 楼盘 > 楼盘优惠 > 正文

背包问题C语言(C语言背包问题(数据结构))

2022-07-26 05:22:32 楼盘优惠 来源:
导读 想必现在有很多小伙伴对于C语言:背包问题(数据结构)方面的知识都比较想要了解,那么今天小好小编就为大家收集了一些关于C语言:背包问题(

想必现在有很多小伙伴对于C语言:背包问题(数据结构)方面的知识都比较想要了解,那么今天小好小编就为大家收集了一些关于C语言:背包问题(数据结构)方面的知识分享给大家,希望大家会喜欢哦。

1、详细程序代码如下:

2、用VC6.0编译.保存代码时,以.C为后缀名

3、下面是一组测试数据:

4、芝属士回答,治版权必究日,未经许消可,不动得转载

5、请输入背包能容纳的最大重量:20

6、请输入物品个数:10

7、请输入每一个物品的重量和价值:1,11,2,22, 3,33.....10,100

8、们生多现日那相明此山争身具完矿维置厂火。

9、结果是正确的.

10、以民当关向边被取例,议书验断细。

11、#include

12、#include

13、#include

14、#define NUMBER 20/*最大物品数量*/

15、#define TRUE 1

16、#define FALSE 0

17、struct Record/*本结构体用于保存每一次结果*/

18、{

19、int totalWeight;/*本次结果的总价值*/

20、int goods[NUMBER];/*本次结果对应的下标*/

21、struct Record *next;

22、};

23、struct Record *headLink;

24、struct Record result;

25、int stack[NUMBER];

26、int top;

27、int weight[NUMBER];/*保存物品重量的数组*/

28、int value[NUMBER];/*保存对应(下标相同)物品的价值*/

29、int knapproblen(int n,int maxweight,int weight[]);

30、void CreateHeadLink(void);

31、struct Record *MallocNode(void);

32、void InsertOneNode(struct Record *t);

33、void GetResult(void);

34、void ShowResult(void);

35、void main()

36、{

37、int n,i;

38、int maxWeight;/*背包能容纳的最大重量*/

39、printf("请输入背包能容纳的最大重量:n");

40、scanf("%d",&maxWeight);

41、printf("请输入物品个数:n");

42、scanf("%d",&n);

43、printf("请输入每一个物品的重量和价值:n");

44、for(i=0;i

45、{

46、printf("请输入第%d个物品重量n",i+1);

47、scanf("%d",&(weight[i]));

48、printf("请输入第%d个物品价值n",i+1);

49、scanf("%d",&(value[i]));

50、}

51、if(knapproblen(n,maxWeight,weight)==TRUE)/*调用背包处理函数,如果成功就输出“答案”*/

52、{

53、GetResult();/*遍历链表,查找最佳的结果*/

54、ShowResult();/*显示结果*/

55、}

56、free(headLink);

57、getch();

58、}

59、/*调用背包处理函数*/

60、int knapproblen(int n,int maxweight,int weight[])

61、{

62、struct Record *p;

63、int i=1,j;

64、int tempTop=0;

65、top=0;/*先赋栈指针为0*/

66、CreateHeadLink();/*先建立链头*/

67、while((maxweight>0)&&(i<=n))/*当还可以装下物品,且物品没有用完时*/

68、{

69、if((maxweight-weight[i]==0)||(maxweight-weight[i]>0)&&(i

70、{

71、stack[++top]=i;/*把对应物品的处标保存到栈中*/

72、p=MallocNode();/*每一次得到一个结果后,就将该结果保存到链表中*/

73、for(tempTop=top,j=0;tempTop>0;tempTop--,j++)

74、{

75、p->totalWeight+=value[stack[tempTop]];/*得到本次结果的总价值*/

76、p->goods[j]=stack[tempTop];/*得到本次结果对应的物品下标*/

77、}

78、InsertOneNode(p);/*加到链表中*/

79、maxweight=maxweight-weight[i];

80、}

81、if(maxweight==0)/*能装入包中*/

82、{

83、return TRUE;

84、}

85、else if((i==n)&&(top>0))/*继续测试*/

86、{

87、i=stack[top];

88、top=top-1;

89、maxweight=maxweight+weight[i];

90、}

91、i++;

92、}

93、return FALSE;

94、}

95、/************************************

96、函数功能:建立链表表头

97、************************************/

98、void CreateHeadLink(void)

99、{

100、struct Record *p;

101、p=(struct Record*)malloc(sizeof(struct Record));

102、headLink=p;

103、p->next=NULL;

104、}

105、/************************************

106、函数功能:申请一个新结点,并将其初始化

107、************************************/

108、struct Record *MallocNode(void)

109、{

110、struct Record *p;

111、int i;

112、p=(struct Record*)malloc(sizeof(struct Record));

113、if(p==NULL)

114、return NULL;

115、p->totalWeight=0;/*初始化总价值为0*/

116、for(i=0;i

117、p->goods[i]=-1;/*初始化下标为-1,即无效*/

118、p->next=NULL;

119、return p;

120、}

121、/************************************

122、函数功能:在链表的结尾处增加一个结点

123、************************************/

124、void InsertOneNode(struct Record *t)

125、{

126、struct Record *p;

127、p=headLink;

128、while(p->next)

129、{

130、p=p->next;

131、}

132、p->next=t;

133、}

134、/************************************

135、函数功能:遍历链表,找总价值最大的结点保存到

136、result中

137、************************************/

138、void GetResult(void)

139、{

140、struct Record *p;

141、int i;

142、result.totalWeight=headLink->next->totalWeight;/*先将第一个结点当作"最佳"结果*/

143、for(i=0;i

144、{

145、if(headLink->next->goods[i]==-1)

146、break;

147、result.goods[i]=headLink->next->goods[i];

148、}

149、p=headLink->next->next;

150、while(p)/*查找最佳结果*/

151、{

152、if(p->totalWeight>result.totalWeight)/*如果发现p点价值比当前结果还大,则将p又作为最佳结果*/

153、{

154、result.totalWeight=p->totalWeight;

155、for(i=0;i

156、result.goods[i]=-1;

157、for(i=0;i

158、{

159、if(p->goods[i]==-1)

160、break;

161、result.goods[i]=p->goods[i];

162、}

163、}

164、p=p->next;

165、}

166、}

167、/***************************

168、显示最佳结果

169、*******************************/

170、void ShowResult(void)

171、{

172、int i;

173、printf("最佳装载如下:n");

174、for(i=0;i

175、{

176、if(result.goods[i]==-1)

177、break;

178、printf("weight[%d]=%dtvalue[%d]=%dt",result.goods[i],weight[result.goods[i]],result.goods[i],value[result.goods[i]]);

179、if((i+1)%2==0)

180、printf("n");

181、}

182、printf("n总价值是:n%d",result.totalWeight);

183、}

本文到此结束,希望对大家有所帮助。


版权说明: 本文由用户上传,如有侵权请联系删除!


标签: