南邮 OJ 1278 最小重量机器设计问题

最小重量机器设计问题

时间限制(普通/Java) :  10000 MS/ 30000 MS          运行内存限制 : 65536 KByte
总提交 : 83            测试通过 : 14 

比赛描述

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wiy 是从供应商处购得的部件i的重量,ciy是相应的价格。试设计一个算法,给出总价格不超过c的最小重量机器设计。

对于给定的机器部件重量和机器部件价格,编程计算总价格不超过d的最小重量机器设计。



输入

第一行有个正整数md。接下来的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

提示

undefined

题目来源

算法设计与实验题解



#include<iostream>
#define MAX_N 100

int n,m,d,minW;
int w[MAX_N][MAX_N];
int c[MAX_N][MAX_N];
int bf[MAX_N];			//buy from
int r[MAX_N];			//result

void determ(int i, int cc, int cw){
	if(i==n){
		minW = cw;
		for(i=0;i<n;i++){
			r[i] = bf[i];
		}
		return;
	}
	for(int j=0;j<m;j++){
		if(cc+c[i][j]<=d && cw+w[i][j]<minW){
			bf[i] = j;
			determ(i+1, cc+c[i][j], cw+w[i][j]);
		}
	}
}

int main(){
	int i,j;
	scanf("%d%d%d",&n,&m,&d);
	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]);
		}
	}
	minW = INT_MAX;
	determ(0,0,0);
	if(minW != INT_MAX){
		printf("%d\n",minW);
		for(i=0;i<n;i++){
			printf("%d ",r[i]+1);
		}
		printf("\n");
	}else{
		printf("No Solution");
	}
}






你可能感兴趣的:(ACM,南邮OJ,最小重量机器设计问题)