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

回溯法:从后往前记录全局最优解(最小价值,最小重量,尽管他们不是同一个物品上的,最大程度贪心),因为采用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. core java 9 代码_Java Core 学习笔记——3.char/Unicode/代码点/代码单元
  2. 还在纠结垃圾分类问题?带你用Python感受ImageNet冠军模型SENet的强大
  3. 分布式单点登录框架XXL-SSO
  4. 疫情数据可视化讨论,作为数据分析师的我真是太“南”了!(附代码)
  5. 无人机图像处理工具-亮度、对比度、饱和度调整/匀光匀色/图像去雾
  6. 【POI word】使用POI实现对Word的读取以及生成
  7. 前端学习(64):css继承属性小结
  8. 感知机(Perceptro)二分类算法原理学习小结记录
  9. 《圈子圈套2》—— 读后总结
  10. EXPLOITING CVE-2016-2060 ON QUALCOMM DEVICES
  11. springboot发送短信验证码
  12. Ubuntu16.04下安装QQ的完整操作记录(经验证可用)
  13. 微信小程序开发账号找回
  14. gif动图可以压缩大小吗?gif图片怎么压缩?
  15. Azure语音合成再添新声音,“风格迁移”技术为不同音色实现多情感演绎
  16. 欢迎来到wxWindows
  17. 一文详解 .obj 和 .mtl文件格式
  18. WIN7下创建ODBC数据源到SQL Server的新数据源
  19. C++][基础知识 5] 虚函数
  20. 织梦DedeCMS在自定义表单里加入验证码的方法

热门文章

  1. 第二届『Citric杯』NOIP提高组模拟赛
  2. 怎么申报高新?流程是什么??
  3. PHP 浏览器下载文件
  4. matlab 热图,基于表格数据创建热图
  5. 如何把一张透明的图片做成不透明的
  6. 小米笔记本Air 13.3 的键盘功能按键使用方式
  7. 2022年墙壁挂架/电视支架怎么选?四大专业电视支架品牌介绍
  8. 00后表示真干不过,部门新来的00后网络安全工程师已把我卷崩溃,想离职了...
  9. 出现ConnectionError: Error 10061 connecting to 127.0.0.1:6379. 由于目标计算机积极拒绝,无法连接的解决方法
  10. BFS(宽度优先搜索、广度优先搜索)