最小重量机器设计问题
- 问题描述:设某一机器由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 */