最小重量机器问题

来源:互联网 发布:零食 优惠 知乎 编辑:程序博客网 时间:2024/05/16 02:15
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。
设wij 是从供应商j 处购得的部件i的重量,cij是相应的价格。
对于给定的机器部件重量和机器部件价格,编程计算总价格不超过d的最小重量机器设计。
输入
第一行有3 个正整数n ,m和d。接下来的2n 行,每行n个数。前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>int i,j;int n = 0; // 部件数int m = 0; // 厂商数int d = 0; // 最大价格int **c; // 部件 i 厂商 j 的价格int **w; // 部件 i 厂商 j 的重量int cT = 0; // 当前总价格int wT = 0; // 当前总重量int bestw; // 当前最小重量int *bestx;int *savex;void backtrack(int t){if(t==n-1){if(cT<bestw || bestw==0){bestw=cT;for(j=0;j<n;j++)savex[j]=bestx[j];}return;}else{for(j=0;j<m;j++) {if(cT+c[t][j]<=d){cT+=c[t][j];wT+=w[t][j];bestx[t]=j+1;backtrack(t+1);bestx[t]=0;cT-=c[t][j];wT-=w[t][j];}}}}int main() {//录入数据scanf("%d%d%d",&n,&m,&d);c=new int *[n];for(i=0;i<n;i++)c[i]=new int[m];w=new int *[n];for(i=0;i<n;i++)w[i]=new int[m];bestx = new int[m];savex = new int[m];for (i=0;i<n;i++) for (j=0;j<m;j++) scanf("%d",&c[i][j]);for (i=0;i<n;i++) for (j=0;j<m;j++) scanf("%d",&w[i][j]);backtrack(0);printf("%d\n",bestw);for(i=0;i<n;i++)printf("%d ",savex[i]);return 0;}


0 0