最小重量机器设计问题

原创 2015年11月19日 22:34:57

input.txt

3 3 4
3 2 1
1 2 3
1 2 2
1 2 3
3 2 1
2 2 2


#include <iostream>
#include <fstream>
using namespace std;



int main(){
	//读取文件
	ifstream in("input.txt", ios::in);
	if (!in.is_open()){
		cout << "Error opening file";
		exit(1);
	}
	int n = in.get() - '0';
	in.get();
	int m = in.get() - '0';
	in.get();
	int d = in.get() - '0';
	in.get();
	int** c = new int*[n];
	for (int i = 0; i < n; i++){
		c[i] = new int[m];
	}
	int** w = new int*[n];
	for (int i = 0; i < n; i++){
		w[i] = new int[m];
	}
	for (int i = 0; i < 2 * n; i++){
		if (i < n){
			for (int j = 0; j < m; j++){
				c[i][j] = in.get() - '0';
				in.get();
			}
		}
		else if ((i < 2 * n) && (i >= n)){
			for (int j = 0; j < m; j++){
				w[i-3][j] = in.get() - '0';
				in.get();
			}
		}
	}
	cout << n << " " << m << " " << d << endl;
	for (int i = 0; i < n; i++){
		cout << c[i][0] << " " << c[i][1] << " " << c[i][2] << endl;
		cout << w[i][0] << " " << w[i][1] << " " << w[i][2] << endl;
	}
	//读取文件完毕
	//数据处理
	//已初始化数据n,m,d,c[][],w[][]
	bool flag = true;
	int ci = 0;//当前层
	int* bestx = new int[n];//记录最佳序列
	int* x = new int[n];//记录当前序列
	int bestw = INT_MAX;//最小重量
	int nc = 0;//当前价值
	int nw = 0;//当前重量
	int j = 0;//第一个
	int* min = new int[n];
	min[n - 1] = 0;
	int r = 0;
	for (int i = n-1; i >0; i--){
		r = w[i][0];
		for (int j = 1; j < m; j++){
			if (w[i][j] < r){
				r = w[i][j];
			}
		}
		min[i-1] = r+min[i];
	
	}
	
	while (flag){
		while ((ci < n) && (nc < d)){//向左走(上界)
			nc += c[ci][j];
			nw += w[ci][j];
			x[ci] = j;
			ci++; 
			if (ci != n){//到叶子就不跑左子树
				j = 0;
			}
			
		}
		if ((ci == n)&&(nc<=d)){//到叶子
			if (nw < bestw){
				bestw = nw;
				for (int z = 0; z < n; z++){
					bestx[z] = x[z];
				}
			}
		}
		//减去多余
		ci--;
		nc -= c[ci][x[ci]];
		nw -= w[ci][x[ci]];
		j = x[ci];
		do{//移动当前层的下一个节点
			j++;
		} while ((j < m) && (nc + c[ci][j]>d) );//判断下一个节点是否可用

		while ((bestw != 0) && (nw + min[ci] + w[ci][j] >= bestw)&&(j<m)){//判断有没有必要移动到下一个节点(下界)
			j++;
		}

		while (j == m){//当该层跑完回溯上层直到有一层还没遍历完的
			ci--;
			if (ci == -1){
				flag = false;
				break;
			}
			nc -= c[ci][x[ci]];
			nw -= w[ci][x[ci]];
			j = x[ci] + 1;
		}

		

	}
	cout << "最小重量" << bestw << endl;
	for (int i = 0; i < n; i++){
		cout << " " << 1+bestx[i];
	}
	cout << endl;
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

5-3最小重量机器设计问题

  • 2012年12月14日 18:57
  • 98KB
  • 下载

最小重量机器设计问题

最小重量机器设计问题         设某一机器由n个部件组成,每一种价格都可以从m个不同的供应商处购得。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。        ...
  • LDUtyk
  • LDUtyk
  • 2016年12月24日 16:58
  • 641

最小机器重量设计问题(回溯法-满m叉树)

1.问题描述:        设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设 wij 是从供应商j 处购得的部件i的重量,cij 是相应的价格。 试设计一个回溯算法...
  • Limbos
  • Limbos
  • 2015年12月26日 21:16
  • 1747

最小重量机器设计问题 5_1 6_4

最小重量机器设计问题 回溯法 分支限界 剪枝函数 限界函数

SDIBT 1350 最小重量机器设计问题

试题连接:http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=1350   最小重量机器设计问题 Time Limit: 2 Sec  Me...

最小重量机器设计问题——优先队列式分支限界法

本代码运用优先队列式分支限界法解决了最小重量机器设计问题。 算法思路: 对于在某一个供应商是否购买某一零件,可以将这个过程抽象化为子集树模型。该树的第i层则代表第i个零件的购买情况,每个商家j对应一棵...

SDIBTOJ1350-最小重量机器设计问题

题目链接:http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=1350 题目描述:给出n个部件在m个商家的价格,及其制造的重量,求在不大于给定价格d下...
  • vjudge
  • vjudge
  • 2012年12月04日 14:52
  • 536

最小机器设计问题代码实现

  • 2014年07月14日 11:08
  • 3KB
  • 下载

最小重量机器问题源码

  • 2011年06月21日 08:46
  • 2KB
  • 下载

回溯法 最小重量机器设计

描述 设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wiy 是从供应商j 处购得的部件i的重量,ciy是相应的价格。试 设计一个算法,给出总价格不超过c的最小重量机器设计。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最小重量机器设计问题
举报原因:
原因补充:

(最多只允许输入30个字)