先把灯泡按照电压从小到大排序。可以把一些灯泡换成电压更高的灯泡以节省费用。
值得注意的就是初始化时,应该初始化为当前的最优方案。例如当前i=2,则应该用i=2时候的电源和灯泡,因为排好序后,当前的电压是最大的,一定会用到当前的灯泡。这样才能保证当前是最优的,有些贪心的思想。
d[i]=min{d[i],d[j]+(s[i]-s[j])*c[i]+k[i]}
表示前j个先用最优方案买,然后第j+1~i个都用第i号电源。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include<map>
#define pi acos(-1.0)
#define eps 1e-6
#define INF 999999999
#define ll long long
using namespace std;
struct node
{
int v;
int k,c,l;
}a[1010];
bool cmp(node a,node b)
{
return a.v<b.v;
}
int s[1010];
int d[1010];
int main()
{
int n;
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
cin>>a[i].v>>a[i].k>>a[i].c>>a[i].l;
sort(a,a+n,cmp);
s[0]=a[0].l;
for(int i=1;i<n;i++)
s[i]=s[i-1]+a[i].l;
for(int i=0;i<n;i++) //初始化为当前最优方案
d[i]=s[i]*a[i].c+a[i].k;
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
d[i]=min(d[i],d[j]+(s[i]-s[j])*a[i].c+a[i].k);
}
}
cout<<d[n-1]<<endl;
}
return 0;
}