题意: 给定一些灯泡,每种灯泡有不同的电压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]);}
}