参考资料:
http://acm.lilingfei.com/uva-11400-lighting-system-design-%E4%BE%8B%E9%A2%989-6_138
只能往上换,不能往下换,电压最高的灯泡必须保留。
参考资料上证明了不能隔着换。
代码
#include<bits/stdc++.h>
using namespace std;
struct bb
{
int V,K,C,L;
bb(){V=K=C=L=0;}
bool operator < (const bb& rhs) const
{
return V<rhs.V;
}
};
bb BB[1010];
int n;
int dp[1010];
int sum[1010];
int main()
{
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
scanf("%d %d %d %d",&BB[i].V,&BB[i].K,&BB[i].C,&BB[i].L);
sort(BB+1,BB+n+1);
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+BB[i].L;
dp[i]=sum[i]*BB[i].C+BB[i].K;
for(int j=1;j<i;j++)
dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j])*BB[i].C+BB[i].K);
}
printf("%d\n",dp[n]);
}
return 0;
}