博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
回溯法-求解装载问题(类似0-1背包)
阅读量:6302 次
发布时间:2019-06-22

本文共 1308 字,大约阅读时间需要 4 分钟。

  • 问题描述:
    • 在n个集装箱要装上重为W的船,集装箱i的重量 wi。
    • 将尽可能重的集装箱装上船,当重量相同时,取集装箱个数尽量少。
  • 要求:
  1. 采用回溯法
  2. 采用剪枝条件
    • 左孩子:只装载满足重量的集装箱
    • 右孩子:至少要选3个集装箱
#include 
#include
#include
#define MAXN 20 //最多集装箱个数int n, W, int maxw; //maxw:存放最优解的总重量 int x[MAXN]; //x:存放最优解向量int minm = 32767; //minm:存放最优解的集装箱个数,初始为最大值 //考虑第i个集装箱,tw为考虑第i个集装箱时装入的总重量,其装载解向量为op void Loading(int w[], int tw, int m, int op[], int i){ int j; if(i > n){ //找到一个叶子节点 if(tw <= W && (tw > maxw || (tw == maxw && m < minm))) { maxw = tw; minm = tw; for(j=1; j<=n; j++){ x[j] = op[j]; } } } else { //尚未找完所有物品 op[i] = 1; //选取第i个集装箱 if(tw + w[i] <= W) //左孩子节点剪枝:装载满足条件的集装箱 Loading(w, tw+w[i], m+1, op, i+1); op[i] = 0; //不选取第i个集装箱,回溯 if(m <= 2) //右孩子剪枝:至少要选3个集装箱 Loading(w, tw, m, op, i+1); }}void dispSolution(int n){ int i; printf("选取的集装箱:\n"); for(i=0; i<=n; i++){ if(x[i]==1) printf(" 选取第 %d 个集装箱\n",i); } printf("总重量 = %d\n",maxw);} int main(){ int w[] = {0,5,2,6,4,3}; //各集装箱重量,不用下标0的元素 int op[MAXN]; //存放临时解 n = 5, W = 10; Loading(w, 0, 0, op, 1); dispSolution(n); }

转载于:https://www.cnblogs.com/noelli/p/6250570.html

你可能感兴趣的文章
POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)
查看>>
从零开始学MVC3——创建项目
查看>>
CentOS 7 巨大变动之 firewalld 取代 iptables
查看>>
延时任务和定时任务
查看>>
linux下的权限问题
查看>>
教你如何使用Flutter和原生App混合开发
查看>>
Spring Boot 整合redis
查看>>
CSS hover改变背景图片过渡动画生硬
查看>>
JDBC(三)数据库连接和数据增删改查
查看>>
淘宝应对"双11"的技术架构分析
查看>>
ssh
查看>>
订单的子单表格设置颜色
查看>>
Office365 Exchange Hybrid 番外篇 ADFS后端SQL群集(一)
查看>>
9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
查看>>
lvs fullnat部署手册(三)rs内核加载toa篇
查看>>
C++策略模式
查看>>
我的友情链接
查看>>
oracle表分区详解
查看>>
网络编程中常见结构体
查看>>
SSL/TLS原理详解
查看>>