hoj 1005 fast food

来源:互联网 发布:9块9淘宝包邮 编辑:程序博客网 时间:2024/06/06 05:11

题意:有n个饭店,从中选择k个建立仓库。给出n和k以及n个饭店的x坐标,每个饭店从离他最近的仓库获得资源,使得所有饭店到仓库的距离和最小。

思路:见代码

#include <stdio.h>#include <math.h>//m[i,j]表示在前 j 个饭店建立 i 个仓库的最小距离和//w[i,j]表示在 d[i..j]之间建立一个仓库的最小距离和int w[201][201], m[31][201], d[201] ;int main(){    int n, p, Case = 1 ;    while ( scanf("%d%d", &n, &p) , n )    {        int i, j, k, t ;        for ( i = 1; i <= n; i++ )             scanf("%d", &d[i]) ;        for ( i = 1; i <= n; i++ )        {            w[i][i] = 0 ;//边界问题            for ( j = i + 1; j <= n; j++ )            {                //奇数个建立在最中间那个,偶数个建立在中间2个都可以                w[i][j] = w[i][j - 1] + d[j] - d[(i + j) / 2] ;            }        }        for ( j = 1; j <= n; j++ ) m[1][j] = w[1][j] ;//边界问题        for ( i = 2; i <= p; i++ )        {            m[i][i] = 0 ;            for ( j = i + 1; j <= n; j++ )            {                m[i][j] = 100000000 ;                for ( k = i - 1; k < j; k++ )                {                    //循环求解最小值                    t = m[i - 1][k] + w[k + 1][j] ;                    if ( t < m[i][j] ) m[i][j] = t ;                }            }        }        printf("Chain %d\nTotal distance sum = %d\n\n", Case++, m[p][n]) ;    }    return 0 ;}


原创粉丝点击