最小重量机器设计问题

来源:互联网 发布:北京幼儿园学费知乎 编辑:程序博客网 时间:2024/04/28 07:13

        

最小重量机器设计问题


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

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


样例输入

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



解:

最小重量机器设计问题:

一共 n 个部件,每个部件可以从m个供应商处取得,
所以回溯每一件部件,假定每个部件的来源之后进行判定

一共n个部件从0开始,当t==n 时到达解空间,
进行判断 总价格小于d 并且重量最小
所以要在回溯过程中进行当前来源的标记,便于进行判断找出最优解。


#include <stdio.h>int n;int m;int d;int w[100][100];//重量 int p[100][100];//价格 int price,weight,min;int temp[100],best[100];void dfs(int t){if(t==n){if(price<=d && weight<min)//总价格小于d如果此时的重量小于当前最小重量,{min=weight;//保存此时的重量为最小重量 for(int i=0;i<n;i++)best[i]=temp[i] ;//此时的零件来源保存为最佳来源数组 }return ;}for(int i=0;i<m;i++){weight+=w[t][i];price+=p[t][i];temp[t]=i;if(price<=d && weight<min)//此时重量小于最小重量,并且满足价格小于d继续判断下个零件 dfs(t+1);weight-=w[t][i];price-=p[t][i];temp[t]=0;}}int main(){scanf("%d %d %d",&n,&m,&d);for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%d",&p[i][j]);}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%d",&w[i][j]);}}price=0;min=9999;weight=0;dfs(0);printf("%d\n",min);for(int i=0;i<n;i++){printf("%d   ",best[i]+1);}printf("\n");} 





0 0
原创粉丝点击