回溯法-经典 01背包问题
2016-06-22 11:37
253 查看
经典问题:
给定N中物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大??分析
1、如上图碰到一组数据,有两种可能:选或者不选,在树种分别由1,0表示。
2、使用递归,在遍历完n个数的时候,判断最终的数是否比最佳价值大,如果比最佳价值大,就把值赋给bestv。
代码:
#include<stdio.h> int c=30; //背包容量 int n=3; //对象数目 int w[]={20,15,15}; //对象重量数组 int v[]={40,25,25}; //对象收益数组 int cw; //当前背包重量 int cv; //当前背包价值 int bestv;//迄今最大的收益 int X ; //记录在树中的移动路径,为1的时候表示选择该组数据,为0的表示不选择该组数据 void getBest(int i) { if(i>=n)//递归结束的判定条件 { if(cv>bestv) bestv=cv; return; } if(cw+w[i]<=c)//进入该节点的右孩子(值为1的孩子) { X[i]=1; cw+=w[i]; cv+=v[i]; getBest(i+1); cw-=w[i];//此处回溯 cv-=v[i]; } X[i]=0;//进入该节点的右孩子(值为0的孩子) getBest(i+1); } int main() { getBest(0); printf("%d",bestv); return 0; }
相关文章推荐
- iOS- 什么是GitHub?关于它的自我介绍「初识 GitHub」
- C# IEnumerable、IEnumerator和foreach的联系与解析
- Java的JSON转换类库GSON的基础使用教程
- TAO服务的Notify服务启动失败问题
- Android exercise 3
- vmware12用 unlocker206能不能解锁 OS X系统
- linux下杀死进程(kill)的N种方法
- android NetworkInfo类
- C#使用winform简单导出Excel的方法
- char与signed char, unsigned char的区别?
- android中文件加密和解密的实现
- 高可用、开源的Redis缓存集群方案
- 如何获取web中某个元素的id
- 使用 HTML5 WebSocket 构建实时 Web 应用
- BZOJ 3437: 小P的牧场 斜率优化DP
- iOS-内存泄露检测工具(MLeaksFinder)
- 设计模式——桥接模式
- 程序员技术练级攻略
- Unity3D学习日记(十) iOS获取局域网的IP
- eclipse 安装svn插件