您的位置:首页 > 其它

hoj 1005 fast food

2013-08-06 14:35 218 查看
题意:有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]
) ;
    }
    return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: