本題難處好像是在于 可以把一些燈泡換成電壓更高的燈泡以節省電源的錢 ,是以也才有了對最優方案的探求
好的處理方法是按照電壓從小到大排序,隻能讓前面的換成後面的,也就滿足了把一些燈泡換成電壓更高的燈泡 的要求;
一種電壓的燈泡,要麼不換,要換則應該全換:換,說明用目前的電源不值;而既然不值則應該全部換掉以避免使用目前電源,不然即增加了燈泡費用又沒節省電源費用,虧大了。。。
狀态轉移詳見代碼
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1010;
struct lamp
{
int v,k,c,l;
}a[maxn];
int n,v1,k1,c1,l1;
int s[maxn];
int d[maxn];
bool cmp(lamp a1,lamp a2)
{
return a1.v<a2.v;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
memset(s,0,sizeof(s));
memset(d,0,sizeof(d));
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&v1,&k1,&c1,&l1);
a[i].v=v1;
a[i].k=k1;
a[i].c=c1;
a[i].l=l1;
}
sort(a+1,a+n+1,cmp);
s[0]=0;
for(int i=1;i<=n;i++)
{
s[i]=s[i-1]+a[i].l;
}
d[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<i;j++)
{
if(j==-0)
d[i]=(s[i])*a[i].c+a[i].k;
else
d[i]=min(d[j]+(s[i]-s[j])*a[i].c+a[i].k,d[i]);
}
}
printf("%d\n",d[n]);
}
return 0;
}