11400 - Lighting System Design(DP)

本文介绍了一种基于电压和费用的最小费用灯泡选择算法,通过递推方式计算使用不同数量灯泡的最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该题以电压v,使得枚举有序化,对于每一种灯泡,怎么判断是不是要用它呢? 如何形成递推呢?

我们知道,递推就是要用到之前早已存好的值来确定当前最优解,所以我们用d[i]表示用1~i种灯泡的最小费用。

由于每种灯泡要么使用,要么被别的灯泡替代,所以d[i] = min(d[i],d[j] + (s[i]-s[j])*a[i].c + a[i].k);   其中j < i  表示前j个先用最优方案买,然后第j+1~i个都用第i号灯泡。

由于第n个灯泡电压最高,无法被别的灯泡所替代,所以必定有这个灯泡,   显然这个递推关系是严谨的 。  它可以完美的利用前面所有储存的最优方案。

细节参见代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 10;
const int INF = 2000000000;
int n,d[maxn],s[maxn];
struct node{
    int v,k,c,l;
}a[maxn];
bool cmp(node a,node b) {
    return a.v < b.v;
}
int main() {
    while(~scanf("%d",&n)&&n) {
        for(int i=1;i<=n;i++) scanf("%d%d%d%d",&a[i].v,&a[i].k,&a[i].c,&a[i].l);
        sort(a+1,a+1+n,cmp);
        s[0] = 0; d[0] = 0;
        for(int i=1;i<=n;i++) s[i] = s[i-1] + a[i].l;
        for(int i=1;i<=n;i++) {
            d[i] = INF;
            for(int j=0;j<i;j++) {
                d[i] = min(d[i],d[j] + (s[i]-s[j])*a[i].c + a[i].k);
            }
        }
        printf("%d\n",d[n]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值