网站首页 楼盘 > 楼盘优惠 > 正文
想必现在有很多小伙伴对于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、} 本文到此结束,希望对大家有所帮助。
版权说明:
本文由用户上传,如有侵权请联系删除!
猜你喜欢:
- 2022-09-15 母姓的历史(母姓的来历)
- 2022-09-15 酷酷跑兑换码(天天酷跑cdk兑换码怎么获得)
- 2022-09-15 我叫mt网游(网游mt什么意思)
- 2022-09-15 6年免检车行驶证需要盖章吗(6年免检行驶证要盖章吗)
- 2022-09-15 托克逊杏花节是几月几号(托克逊杏花节是几号)
- 2022-09-15 红外青轴是什么(青轴是什么)
- 2022-09-15 南造云子是否真实存在知乎(南造云子是否真实存在)
- 2022-09-15 大人吓着了有什么症状怎么叫魂(大人吓掉魂有什么症状)
最新文章:
- 2023-07-02 怎么选择好羊奶(挑选优质羊奶 如何挑选优质羊奶)
- 2023-07-02 最完整木质结构的古代皇宫建筑群(木质结构古代皇宫建筑群是什么)
- 2023-07-02 红木家具如何挑选
- 2023-07-02 卫生间太暗怎么装修(卫生间太暗怎么办)
- 2023-07-02 窗户贴膜怎么贴才好(窗户贴膜怎么贴)
- 2023-07-02 保险丝熔断的原因初中物理(保险丝熔断的原因是什么)
- 2023-07-02 左眼皮一直跳怎么回事女生(左眼皮一直跳怎么回事)
- 2023-07-02 狗狗乱拉便便怎么办(狗狗乱拉粑粑怎么办)
- 2023-07-02 金毛皮肤病是什么样子(金毛狗狗的皮肤病要如何处理)
- 2023-07-02 榆木家具怎么样(榆木家具怎么保养)
- 2023-07-02 煤气灶保养小常识(煤气灶如何保养)
- 2023-07-02 好听不易撞的网名二字带特殊符号(2020特殊符号网名)
- 2023-07-02 小区房子地基下沉怎么办(地基下沉怎么办)
- 2023-07-02 怎样除猫猫身上的跳蚤(怎么除掉猫身上的跳蚤)
- 2023-07-02 五险一金指什么工厂(五险一金指什么)
- 2023-07-02 空调选购技巧(空调机如何选购)