求解最小机器重量(回溯法/分支限界)

回溯法:从后往前记录全局最优解(最小价值,最小重量,尽管他们不是同一个物品上的,最大程度贪心),因为采用DFS深度优先,会马上得到一个结果,然后比较当前选择的重量,价值+在最程度贪心下的最小重量和价值,是否小于给定条件(价值)和已经得到的最小结果值。
分支限界:采用优先队列(堆)根据条件设置优先级,找到的第一个结果即为答案,重点找到一个好的限界函数。
全局出发,每次选择一个物品后,算出最大程度贪心取得的最小重量,以此来排序。(如果用已经选择的重量&价值来排序,因为没有考虑后面的情况会增加搜索次数)
回溯&分支限界该从全局出发,最大程度估算值可以提高算法效率。

回溯:

#include<bits/stdc++.h>
using namespace std;
int n, m, cost;     //n个部件,m个供应商,不能超过cost的开销
int w[30][30];      //w[i][j]表示部件i从供应商j得到的重量
int c[30][30];     //c[i][j] 表示部件i从供应商j得到的价值
int min_w = 1<<30;
int x1[52], x2[52];
/*
增加剪枝条件
从后面记录分别把最小重量和最小价值的和相加记录在一个数组中(最大程度贪心)
当搜到第k件把剩下从k+1件到第n件的最优解(这个解一般取不到)相加
与已经得到的最小结果相比较。可以剪很多枝。
*/
void dfs(int k, int cw, int cc)         //每次搜第k个部件
{if(k == n+1) {min_w = min(min_w, cw); return ;}for(int i = 1; i <= m; i++)if(cw + w[k][i] + x1[k+1] <= min_w && cc + c[k][i] + x2[k+1] <= cost)dfs(k+1, cw+w[k][i], cc+c[k][i]);
}int main()
{cin >> n >> m >> cost; for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)cin >> w[i][j];for(int i = 1; i <= n; i++)for(int j = 1;j <= m; j++)cin >> c[i][j];for(int i=n;i>0;i--){x1[i] = 1<<30;x2[i] = 1<<30;for(int j = 1; j <= m; j++) //第i个物件,第j个供应商,提供的机器费用 x2[i] = min(x2[i], c[i][j] + x2[i+1]),x1[i] = min(x1[i], w[i][j] + x1[i+1]);    }       dfs(1, 0, 0);cout << min_w;
}

分支限界:

#include<bits/stdc++.h>
using namespace std;
/*
lb:在已确定运货商和零件的条件下和最大贪心情况下,得到的最小重量
如果直接用当前层数重量和价值排序会造成没有办法马上找到最优解时间复杂度高
从全局出发,大致估算重量
*/
int n, m, cost, w[30][30], x[52], c[30][30];
struct Node{int i, w, c, lb;bool operator<(const Node a)const{return lb > a.lb;}
}e, e1;
void bound(Node &x){int minsum = 0;for(int i=x.i + 1; i <= n; i++){int i_w = 1<<30;for(int j = 1; j <= m; j++)i_w = min(i_w, w[i][j]);minsum += i_w;  }x.lb = x.w + minsum;
}
void bfs()
{priority_queue<Node> Q;bound(e);Q.push(e);while(!Q.empty()){e=Q.top(); Q.pop();if(e.i == n) break;for(int j = 1; j <= m; j++){e1.i = e.i+1;e1.w = w[e1.i][j] + e.w;e1.c = c[e1.i][j] + e.c;if(e1.c + x[e1.i+1] <= cost){ //不满足给定花费要求的剪去 bound(e1);Q.push(e1);}}}
}
int main()
{cin >> n >>m >> cost; for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)cin >> w[i][j];for(int i=1; i <= n; i++)for(int j = 1; j <= m; j++)cin >> c[i][j];for(int i = n; i > 0; i--){x[i] = 1<<30;for(int j = 1;j <= m; j++) x[i] = min(x[i], c[i][j] + x[i+1]);}bfs();cout << e.w;
}

求解最小机器重量(回溯法/分支限界)相关推荐

  1. 回溯法求解最小机器重量设计问题

    回溯法介绍 回溯法实际上是一个类似穷举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯",尝试别的路径. 它适合于解一些组合数较大的最优化问题 ...

  2. N后问题详解(回溯法)--Java实现

    目录 一.问题描述 二.求解思路 三.代码实现 一.问题描述 N皇后问题:在N*N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法? 二 ...

  3. 用回溯法解决最小重量机器设计问题

    问题:设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得.设wij是从供应商j处够来的部件i的重量,cij是相应的价格. 试设计一个算法,给出总价格不超过c的最小重量机器设计. 算法设 ...

  4. 回溯法求解N皇后问题(Java实现)

    回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并以此慢慢地扩大问题规模,迭代地逼近最终问题的解.这种迭代类似于穷举并且是试探性的,因为当目前的可 ...

  5. 回溯法求解:工作分配问题

    一.问题描述: 设有 n 件工作分配给 n 个人.将工作 i 分配给 j 个人所需的费用为  .试设计一个算法,为每个人都分配 1 件不同的工作,并使得总费用最小. 输入格式:第一行有 1 个正整数 ...

  6. 回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle)

    转载自:用回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle) N皇后问题 八皇后问题,是一个古老而著名的问题.该问题是国际西洋棋棋手马克斯·贝瑟尔于 ...

  7. LeetCode 37. Sudoku Solver--数独求解(回溯法)--Java 3ms,Python 80ms 解法

    题目地址: Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must sa ...

  8. 0/1背包问题-----回溯法求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

  9. 【算法分析】实验 4. 回溯法求解0-1背包等问题

    目录 实验内容 实验目的 实验结果 步骤1:描述与分析 步骤2:策略以及数据结构 步骤3 步骤4 步骤5 步骤6 实验总结 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设 ...

最新文章

  1. 《Windows Vista for Developers》系列
  2. mac mysql本地连接数_如何用command line链接mysql
  3. vs2017中报无法打开包括文件: corecrt.h: No such file or directory
  4. plsql job执行多个存储过程_在Kubernetes的一个Pod内连续依次执行Container
  5. 数据挖掘流程(二):数据预处理
  6. java学习曲线建议
  7. Ubuntu Tweak 0.8.2 发布
  8. OC之非ARC环境下循环retain问题
  9. 如何使用MySQL和JPA使用Spring Boot构建Rest API
  10. BestCoder Round #4 之 Miaomiao's Geometry(2014/8/10)
  11. LayoutInflater(二)
  12. Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本
  13. QIIME2进阶四_QIIME2扩增子基因序列系统发育分析
  14. 删除可恶的7654.com,7654导航篡改首页恢复,如何解决浏览器被7654劫持
  15. 彻底改变计算机用户名,提升电脑系统安全:如何修改电脑登录用户名以及密码呢?...
  16. 电机位置、速度检测方法大合集
  17. BOM展开BAPI(标准BOM、销售BOM、WBS BOM)
  18. bugku convert [MISC]
  19. linux中内核、opencv、Qt各种软件版本查询
  20. 2-2 组合优化问题-常用模型与通用求解器

热门文章

  1. html如何添加web字体,html中字体如何实现加粗(方法介绍)_WEB前端开发,html,字体加粗...
  2. adobe flash player 过期问题
  3. vmware workstation虚拟机连接外网(Nat模式)
  4. vue.js 在微信公众号内实现视频播放
  5. 阿里云服务器发送邮件
  6. F28335第七篇——新建项目之编程演示
  7. 攻防演练建设过程中技术考虑
  8. 人人都能成为闪电网络节点:第7章管理lnd
  9. (已开源)基于高德SDK 、Api,实现纯H5的精准坐标选址工具
  10. ionic的生命周期