Java语言描述:回溯法之最小重量机器问题

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设 wij 是从供应商j 处购得的部件i的重量,cij 是相应的价格。
试设计一个回溯算法,给出总价格不超过d的最小重量机器设计。

对于给定的机器部件重量和机器部件价格,计算总价格不超过d的最小重量机器设计。

package BackTrack;

public class getMinWeight {
	int m = 3;
	int n = 3;
	int d = 4;
	int[][] c = {{1,3,2},{2,2,2},{3,1,2}};
	int [][] w = {{1,3,2},{2,2,2},{3,1,2}};
	int minWeight = Integer.MAX_VALUE;
	int nowValue = 0;
	int tempWeight;
	int[] bestWay = new int[n];
	int[] way = new int[n];
	boolean flag = false;
	//开始回溯算法,假设目前搜索到子集树的第t层。
	public boolean Backtrack(int t){
		//如果t已经大于了n-1,表明之前的搜索已经到达了叶子节点,现在的tempWeight已经是当前的最小值了。
		if(t > n-1 ){
				minWeight = tempWeight;
				for(int i=0;i<n;i++)
					bestWay[i] = way[i];     
				flag = true;
		}
		//当搜索还没有到叶子节点时,对于每一层,选定每个商家继续搜索下去。
		else{
			for(int j=0;j<m;j++){
				tempWeight += w[j][t];
				nowValue += c[j][t];
				way[t] = j;
				//进行剪枝函数,在当前节点符合条件,才继续迭代搜索下去,不符合条件,直接跳过进行下一个商家的搜索。
				if(tempWeight < minWeight && nowValue <= d)
					Backtrack(t+1);
				tempWeight -= w[j][t];
				nowValue -= c[j][t];
			}
		}
		return flag;
	}
	public static void main(String[] args){
		getMinWeight gm = new getMinWeight();
		if(gm.Backtrack(0)== false)
			System.out.println("未找到符合条件的解");
		else{
			System.out.println("零件能够达到的最小重量为"+gm.minWeight);
			System.out.print("购买路径为:  ");
			for(int i : gm.bestWay)
			System.out.print(i+" ");
				
		}
		
	}
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值