装载问题(记录可行解)
2016-04-03 20:47
302 查看
描述:
有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。
输入:
多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi (i=1…n)。n等于0标志输入结束。
输出:
对于每个测例在单独的一行内输出Yes或No。
输入样例:
输出样例:
有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。
输入:
多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi (i=1…n)。n等于0标志输入结束。
输出:
对于每个测例在单独的一行内输出Yes或No。
输入样例:
7 8 2 8 7 7 9 2 8 8 0 0 0
输出样例:
Yes No
#include <iostream> using namespace std; int c1, c2; //分别载重量 int n; //集装箱数量 int w[100]; //集装箱重量 int cw; //c1当前载重量 int bestw; //c1当前最优载重量 int r; //剩余集装箱重量 int x[100]; //当前解 int bestx[100]; //当前最优解 void Backtrack(int i) { if(i > n) { //当前解由于最优解,更新之 if(cw > bestw) { for(int j = 1; j <= n; j++) bestx[j] = x[j]; bestw = cw; } return; } //搜索子树,放入或不放入 r -= w[i]; //剩余容量集合去掉w[i] if(cw + w[i] <= c1) //可放入,且放入 { x[i] = 1; //放入 cw += w[i]; Backtrack(i+1); cw -= w[i]; } if(cw + r > bestw) //剩余容量集合依然是去掉w[i],因为w[i]不放入 { x[i] = 0; Backtrack(i+1); } r += w[i]; //回溯 } int main() { while((cin >> c1 >> c2 >> n) && n) { cw = 0; //每组样例初始化 r = 0; bestw = 0; for(int i = 1; i <= n; i++) { cin >> w[i]; r += w[i]; } Backtrack(1); if(r-bestw <= c2) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }
相关文章推荐
- web应用下绝对路径和相对路径问题
- IDT Hook和GDT的学习
- postgresql+postgis
- Spark交替最小二乘法(ALS)
- Chapter3-图像变换-(1)傅里叶变换
- HDU - CA Loves GCD
- Tomcat服务器的理解
- 第五周进度报告
- 杭电1176 动态规划
- Sobel边缘检测的OpenCV实现
- POJ-2151 Check the difficulty of problems
- 2016.4.3
- zookeeper知识点
- Android之JSON格式数据解析
- 概率论复习笔记
- (源码分析)Android-Universal-Image-Loader (图片异步加载缓存库)的源码解读
- Hadoop学习之RPC
- Android入门(四)UI-创建自定义控件
- 大道至简阅读笔记04
- SSH框架理解