最小重量机器设计问题

最小重量机器设计问题

时间: 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;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注