鸡的选择问题--回溯法
来源:互联网 发布:ug8.0编程实例 编辑:程序博客网 时间:2024/04/27 18:44
#include <iostream>using namespace std;class farm{ friend void compute(int [],int [],int ,int); private: void Backtrack(int i); bool Bound(int i); int n;//总的鸡的个数 int *x;//当前解 int *bestx;//当前最优解 int *w;//鸡的重量的数组 int *v;//鸡的产蛋量的数组 int bestv;//当前最优产蛋量 int cv;//当前产蛋量 int cw;//当前重量 int c;//最大载重};void farm::Backtrack(int i){ if(i>n) { if(cv>bestv) { for(int j=1;j<n;j++) { bestx[j]=x[j]; bestv=cv; } } return ; } if(cw+w[i]<=c) { x[i]=1; cw+=w[i]; cv+=v[i]; Backtrack(i+1); cv-=v[i]; cw-=w[i]; } if(Bound(i+1)>bestv) { x[i]=0; Backtrack(i+1); }}bool farm::Bound(int i){ int b=cv; while(i<=n) { b+=v[i]; i++; } if(b>bestv)//满足上界函数,则进入右子树 { return true; } return false;}void compute(int w[],int v[],int c,int n){ farm f; f.n=n; f.c=c; f.cv=0; f.cw=0; f.x=new int[f.n+1]; f.bestx=f.x; f.bestv=0; f.w=w; f.v=v; f.Backtrack(1); cout<<"最大产蛋量为:"; cout<<f.bestv<<endl; cout<<"所选鸡为:"; for(int i=1;i<=f.n;i++) { cout<<f.bestx[i]<<' '; } delete[] f.x;}int main(){ //int w[]={3,5,2,1}; //int v[]={9,10,7,4}; int n,c; cout<<"请输入总鸡数 n: "; cin>>n; cout<<"请输入总载重量 c: "; cin>>c; int *w=new int[n+1]; int *v=new int[n+1]; cout<<"请输入鸡的重量:"; for(int i=1;i<n+1;i++) { cin>>w[i]; } cout<<"请输入鸡的产蛋量"; for(int i=1;i<n+1;i++) { cin>>v[i]; } compute(w,v,c,n); return 0;}
注意回溯法的特征鸡的选择问题中,约束函数为:所选鸡的总重量不超过卡车的最大载重量 ;上界函数为Bound(int i) :若将已经选择的鸡和剩下的鸡的所有产蛋量相加还小于当前最有产蛋量,则直接删除右子树。
阅读全文
0 0
- 鸡的选择问题--回溯法
- 回溯法求解和的问题
- N皇后问题的回溯法实现
- 回溯法之彩票问题的实现
- 图的着色问题-回溯法
- 回溯法---->图的着色问题
- 火车调度问题的回溯法解决
- 01背包问题-----回溯法的解决方案
- 回溯法搜索排列树的问题
- 连续邮资问题的回溯法解决办法
- 八皇后问题的回溯法。
- 旅行售货员问题的回溯法求解
- 图的m着色问题-回溯法
- 经典的回溯问题
- 回溯法 -- 装载问题
- 回溯法 背包问题
- 迷宫问题 回溯法
- 【回溯法】装载问题
- 面试问题
- 宏和函数小记
- 大数据未来应用7大趋势 人工智能只占其一
- 下一步
- 有趣的思路题集锦from bzoj/codefoces(乱搞)
- 鸡的选择问题--回溯法
- while,do-while,for循环特点区分
- 欢迎使用CSDN-markdown编辑器
- scrollTop回到顶部详解
- 常用的字符串工具类
- 在linux系统中怎么样查找到大文件?
- 基于衍射的薄膜望远镜相比于反射式望远镜的优缺点
- 网络请求之HttpURLConnection 简述
- nodejs之爬虫网页的信息