题意: 给定一些灯泡,每种灯泡有不同的电压v,电源费用k,每个灯泡的费用c,所需的灯泡的数量L,同种灯泡可以使用相同电源,问最小花费。
思路:dp,每种灯泡要么选要么不选两种状态,状态转移方程是d(i)=min(d[j]+(s[i]-s[j])*c[i]+k[i])。d[i]保存的是最小的开销。
code:
#include <bits/stdc++.h>
using namespace std;
#define ft(i,s,t) for (int i=s;i<=t;i++)
const int N=1005;
const int INF=0x3f3f3f3f;
struct node
{
int v,k,c,l;
}g[N];
int d[N],s[N];
bool cmp(node A,node B)
{
return A.v<B.v;
}
int main()
{
int n;
while (~scanf("%d",&n),n)
{
ft(i,1,n)
{
scanf("%d%d%d%d",&g[i].v,&g[i].k,&g[i].c,&g[i].l);
}
sort(g+1,g+1+n,cmp);s[0]=0;
ft(i,1,n) s[i]=s[i-1]+g[i].l;
ft(i,1,n)
{
d[i]=s[i]*g[i].c+g[i].k;
ft(j,1,i)
d[i]=min(d[i],d[j]+(s[i]-s[j])*g[i].c+g[i].k);
}
printf("%d\n",d[n]);
}
}