最小重量机器设计问题 回溯法

最小重量机器设计问题

  • 问题描述:设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j处够来的部件i的重量,cij是相应的价格。


试设计一个算法,给出总价格不超过c的最小重量机器设计。

  •     算法设计:对于给定的机器部件重量和机器部件价格,计算总价值不超过d的最小重量机器设计。
  •     数据输入:第一行由3个正整数n,m,d。接下来的2n行,每行m个数。前n行是c,后n行是w。
  •      结果输出:将计算的最小重量及每个部件的供应商输出。

输入:
3 3 4
  1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
  输出:
4
1 3 1

  •  代码如下:
  • #include<stdio.h>
    #define max 100
    
    int cost[max][max],weight[max][max];
    int n,m,d;
    int current_weight,current_cost;
    int best_cost,best_weight;
    int array[max],best_array[max];
    
    void print()
    {
    	printf("%d---%d\n",best_weight,best_cost);
    	for(int i=1;i<=n;i++)
    		printf("%d ",best_array[i]);
    	printf("\n");
    }
    
    void BackTrack(int level)
    {
    	if(current_cost>d)
    		return;
    	if(level == n+1)
    	{
    		if(current_cost<=d&¤t_weight<best_weight)
    		{
    			best_cost = current_cost;
    			best_weight = current_weight;
    			for(int i=1;i<=n;i++)
    				best_array[i] = array[i];
    		}
    	}
    	else 
    	{
    		int i,j,k,l;
    		for(i=1;i<=m;i++)
    		{
    			current_weight = current_weight+weight[level][i];
    			current_cost = current_cost+cost[level][i];
    			array[level] = i;
    			BackTrack(level+1);
    			current_weight = current_weight-weight[level][i];
    			current_cost = current_cost-cost[level][i];
    		}
    	}
    }
    
    
    int main()
    {
    	int i,j,k,l;
    	while(scanf("%d%d%d",&n,&m,&d)!=EOF)
    	{
    		for(i=1;i<=n;i++)
    		{
    			for(j=1;j<=m;j++)
    				scanf("%d",&cost[i][j]);
    		}
    		for(i=1;i<=n;i++)
    		{
    			for(j=1;j<=m;j++)
    				scanf("%d",&weight[i][j]);
    		}
    		
    		best_weight = 99999;//max_value;
    		
    		BackTrack(1);
    		
    		print();
    		
    	}
    	return 0;
    }
    /*
    3 3 4
    1 2 3
    3 2 1
    2 2 2
    1 2 3
    3 2 1
    2 2 2
    */


    原文作者:分支限界法
    原文地址: https://blog.csdn.net/jimanglai/article/details/72846127
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞