0-1背包问题之分支限界法
来源:互联网 发布:重庆最美工商人投票 编辑:程序博客网 时间:2024/05/17 08:40
有n个物体,重量和价值已知,要放入容量为c的背包里,放入的时间,要求放入的总重量不能超过包的容量,同时保证价值最大。
前面分别用回溯法、暴力搜索法进行了求解,这里利用分支限界法进行求解。参考代码如下:
#include <stdio.h>#include <stdlib.h>typedef struct QNode{int value;//当前结点的总价值int weight; //当前的总重量struct QNode *next;}QNode, *QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}Queue;int initQueue(Queue &Q){Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front)return -1;Q.front->next=NULL;return 1;}int emptyQueue(Queue Q){if (Q.front==Q.rear)return 1;elsereturn 0;}int destroyQueue(Queue &Q){while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return 1;}int enQueue(Queue &Q, int value, int weight){QueuePtr p=(QueuePtr)malloc(sizeof(QNode));if(!p)return -1;p->value=value; p->weight=weight; p->next=NULL;Q.rear->next=p;Q.rear=p;return 1;}int deQueue(Queue &Q, int &value, int &weight){QueuePtr p;if(Q.front==Q.rear)return -1;p=Q.front->next;value=p->value;weight=p->weight;Q.front->next=p->next;if(Q.rear==p) Q.rear=Q.front;free(p);return 1;}Queue loadingQueue;int bestvalue, n;void inQueue(int value, int weight, int i){if(i==n-1){if(value>bestvalue)bestvalue=value;}elseenQueue(loadingQueue,value,weight);}int main(){int i,j,k;int *w, *v, ew, ev;int c;printf("input the number of things and the volume of ships:");scanf("%d%d",&n,&c);w=new int[n];v=new int[n];printf("input the weights:");for(i=0;i<n;i++)scanf("%d",&w[i]);printf("input the values:");for(i=0;i<n;i++)scanf("%d",&v[i]);initQueue(loadingQueue);enQueue(loadingQueue,-1,0);//int deQueue(Queue &Q, int &value, int &weight)//void inQueue(int value, int weight, int i)//int enQueue(Queue &Q, int value, int weight)i=0;//层数ew=0;//扩展结点对应的载重量ev=0;while(true){if(ew+w[i]<=c)inQueue(ev+v[i],ew+w[i],i);inQueue(ev,ew,i);deQueue(loadingQueue, ev,ew);if(ev==-1) //同层结点尾部{if(emptyQueue(loadingQueue)){printf("the result is %d.\n",bestvalue);}enQueue(loadingQueue,-1,0);deQueue(loadingQueue, ev,ew);i++;}}return 0;}
0 0
- 0-1背包问题之分支限界法
- 0-1背包问题---分支限界法
- 0/1背包问题的分支限界
- 算法java实现--分支限界法--0-1背包问题
- 分支限界法的0-1背包问题Python实现
- 分支限界法解0-1背包问题
- 分支限界法之LC 0/1背包
- 分支限界---->0/1背包
- Java语言描述:分支限界法之01背包问题
- 用分支限界解决0-1背包问题
- 分支限界法实现背包问题
- (C++)分支限界法求解背包问题
- 【算法】分支限界法实现0-1背包问题【原创技术】
- 回朔法、分支限界法解0-1背包问题程序, Java, C#
- 0036算法笔记——【分支限界法】0-1背包问题
- 0036算法笔记——【分支限界法】0-1背包问题
- 动态规划、贪心、回溯、分支限界法解0-1背包问题总结
- 用优先队列式分支限界法解决0-1背包问题
- Catalan Number (卡特兰数)
- BIRCH算法学习
- 6.6 类型推断
- 如何制作私人网盘---利用hadoop如何制作网盘指导
- R语言绘图篇
- 0-1背包问题之分支限界法
- HDU 5097 Page Rank(模拟,矩阵运算)
- Decode Ways
- 【线性代数】正交向量与正交子空间
- R语言重抽样与自助法
- c# 子窗口关闭父窗口(适用于机器码激活)
- 小马哥-----高仿三星i8552刷机 拆机主板与开机界面图 14年新高仿
- R语言广义线性模型
- zipalign的APK