最小重量机器设计问题
时间: 2ms 内存:64M
描述:
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设 wij 是从供应商j 处购得的部件i的重量,cij 是相应的价格。
试设计一个回溯算法,给出总价格不超过d的最小重量机器设计。
对于给定的机器部件重量和机器部件价格,计算总价格不超过d的最小重量机器设计。
输入:
输入数据的第一行有3 个正整数n ,m和d(n,m≤20,d≤200)。接下来的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
提示:
参考答案(内存最优[804]):
#include<stdio.h>
#define INF 999999999
int w[22][22];
int c[22][22];
int v[22], s[22];
int m, n, d;
int min, minw, maxc;
void DFS( int t, int p, int cnt ){
int i;
if( t > n ){
if( cnt < min ){
min = cnt;
for( int i=1; i<=m; i++ )
s[i] = v[i];
}
return ;
}
if( cnt > min || d < p ){
return ;
}
for( i=1; i<=m; i++ ){
if( d >= p + c[t][i] ){
v[t] = i;
DFS( t+1, p+c[t][i], cnt+w[t][i] );
}
}
}
int main(){
int i, j;
int tmp, r;
while( scanf( "%d%d%d", &n, &m, &d ) != EOF ){
maxc = minw = 0;
for( i=1; i<=n; i++ ){
for( j=1; j<=m; j++ ){
scanf( "%d", &c[i][j] );
if( j == 1 ) { tmp = c[i][j]; }
else if( tmp < c[i][j] ) { tmp = c[i][j]; }
}
maxc += tmp;
}
for( i=1; i<=n; i++ ){
for( j=1; j<=m; j++ ){
scanf( "%d", &w[i][j] );
if( j == 1 ) { tmp = c[i][j]; r = j; }
else if( tmp > c[i][j] ) { tmp = c[i][j]; r = j; }
}
minw += tmp;
s[i] = r;
}
if( maxc < d ){
printf( "%d\n", minw );
for( i=1; i<n; i++ )
printf( "%d ", s[i] );
printf( "%d", s[i] );
continue;
}
min = INF;
DFS( 1, 0, 0 );
printf( "%d\n", min );
for( i=1; i<n; i++ )
printf( "%d ", s[i] );
printf( "%d", s[i] );
}
return 0;
}
参考答案(时间最优[1992]):
#include<stdio.h>
#define INF 999999999
int w[22][22];
int c[22][22];
int v[22], s[22];
int m, n, d;
int min, minw, maxc;
void DFS( int t, int p, int cnt ){
int i;
if( t > n ){
if( cnt < min ){
min = cnt;
for( int i=1; i<=m; i++ )
s[i] = v[i];
}
return ;
}
if( cnt > min || d < p ){
return ;
}
for( i=1; i<=m; i++ ){
if( d >= p + c[t][i] ){
v[t] = i;
DFS( t+1, p+c[t][i], cnt+w[t][i] );
}
}
}
int main(){
int i, j;
int tmp, r;
while( scanf( "%d%d%d", &n, &m, &d ) != EOF ){
maxc = minw = 0;
for( i=1; i<=n; i++ ){
for( j=1; j<=m; j++ ){
scanf( "%d", &c[i][j] );
if( j == 1 ) { tmp = c[i][j]; }
else if( tmp < c[i][j] ) { tmp = c[i][j]; }
}
maxc += tmp;
}
for( i=1; i<=n; i++ ){
for( j=1; j<=m; j++ ){
scanf( "%d", &w[i][j] );
if( j == 1 ) { tmp = c[i][j]; r = j; }
else if( tmp > c[i][j] ) { tmp = c[i][j]; r = j; }
}
minw += tmp;
s[i] = r;
}
if( maxc < d ){
printf( "%d\n", minw );
for( i=1; i<n; i++ )
printf( "%d ", s[i] );
printf( "%d", s[i] );
continue;
}
min = INF;
DFS( 1, 0, 0 );
printf( "%d\n", min );
for( i=1; i<n; i++ )
printf( "%d ", s[i] );
printf( "%d", s[i] );
}
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。