题目

源地址:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2395

理解

变量多的题目确实头疼,我来稍微捋一下。 题目中给出n中灯泡,不同的灯泡要用不同的电源,相同的灯泡可以使用相同的电源。然后每种灯泡有着四种参数,电压v,电源费用k,每个灯泡的费用c,所需要的该种灯泡的数量l。小脑一动就能明白,每次更换只会采用同一种灯泡,因为不同中灯泡的话要买两种电源,一定不是最优解。 这样的话,按照电压进行排序之后,可以得到递推公式: dp[i]=min(dp[i], dp[j]+(sum[i]-sum[j])*s[i].c+s[i].k) 其中sum[i]=sum[i-1]+s[i].l;

代码


#define MAXN 1000+10

struct node
{
    int v,k,c,l;
}s[MAXN];

int n,sum[MAXN],dp[MAXN];

bool cmp(node a, node b)
{
    return a.v<b.v;
}

void init()
{
    memset(sum,0,sizeof(sum));
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d", &s[i].v,&s[i].k,&s[i].c,&s[i].l);
    }
    sort(s+1,s+n+1,cmp);
}

int main(int argc, char const *argv[])
{
    while(~scanf("%d", &n)&&n)
    {
        init();
        for(int i=1;i<=n;i++)
        {
            sum[i]+=sum[i-1]+s[i].l;
        }
        dp[1]=s[1].k+s[1].c*s[1].l;
        for(int i=2;i<=n;i++)
        {
            dp[i]=inf;
            for(int j=0;j<i;j++)
            {
                dp[i]=min(dp[i], dp[j]+(sum[i]-sum[j])*s[i].c+s[i].k);
            }
        }
        printf("%d\n", dp[n]);
    }
	return 0;
}

更新日志

  • 2014年11月16日 已AC。