hoj 1005 fast food

题意:有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 ;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值