装载问题(记录可行解)
来源:互联网 发布:u盘格式化恢复数据 编辑:程序博客网 时间:2024/05/29 02:41
描述:
有两艘船,载重量分别是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 28 77 9 28 80 0 0
输出样例:
YesNo
#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;}
0 0
- 装载问题(记录可行解)
- 装载问题(回溯)
- 运输问题可行解 差额法(Vogl近似法)
- 暴力枚举之八皇后问题(可行解个数,打印可行解纵坐标,棋盘有洞,n皇后)
- 用贪心算法解背包问题(装载问题)
- 回溯法解装载问题
- 回溯法解装载问题
- 最优装载问题(贪心)
- 装载问题
- 装载问题
- 装载问题
- 装载问题
- 装载问题
- 装载问题
- 装载问题
- 装载问题
- 装载问题
- 装载问题
- init程序
- HTML的元素分类
- Tomcat服务器的理解
- web应用下绝对路径和相对路径问题
- csdn广告越来越多了
- 装载问题(记录可行解)
- Android中自定义控件的步骤
- NYOJ-180-挑剔的小杜(水题)
- hdu 1061 Rightmost Digit
- 成为更好的交谈者
- 谈谈jQuery和js里有关位置和宽高的方法
- PHP 用session与gd库实现简单验证码生成与验证的类
- [DevExpress]GridControl根据条件改变单元格/行颜色(Dev GridControl 单元格着色)
- 生成1-N*N的矩阵,一圈一圈的