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

来源:互联网 发布:电脑桌面日历提醒软件 编辑:程序博客网 时间:2024/05/15 17:33

问题描述:

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

试设计一个回溯算法,对于给定的机器部件重量和机器部件价格,计算总价格不超过c的最小重量机器设计。

算法思想:

     n层m叉子集树问题。部件有n个,供应商有m个,分别用w[i][j]和c[i][j]存储从供应商j 处购得的部件i的重量和相应价格,cost为总价格的上限。利用tempc+c[t][i]<=cost进行剪枝,若是到最后一层时,tempw小于之前得到的minw,则对minw和各部件供应商best[n]进行更新。

     

参考代码如下:

#include<stdio.h>#define N 100int w[N][N];int c[N][N];int best[N],x[N];int n,m;int cost;int tempw=0,tempc=0,minw=10000;void traceback(int t){if(t > n){minw = tempw;for(int i=1;i<=n;i++){best[i] = x[i];}}for(int i=1;i<=m;i++){if(tempw+w[t][i]<minw&&tempc+c[t][i]<=cost){x[t] = i;tempw += w[t][i];tempc += c[t][i];traceback(t+1);tempw -= w[t][i];tempc -= c[t][i];}}}int main(){scanf("%d%d%d",&n,&m,&cost);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&w[i][j]);}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&c[i][j]);}}traceback(1);printf("%d\n",minw);for(int i=1;i<=n;i++){printf("%2d",best[i]);}return 0;} 


原创粉丝点击