Lighting System Design UVA - 11400
题意:你的任务是设计一个照明系统。一共有n(n<=1000)种灯泡选择,不同种类的灯泡必须有不同的电源,但同一种灯泡可以用同一种电源。
每种灯泡用四个数值表示:电压值V,电源费用K,每个灯泡的费用C,和所需灯泡的数量L。
题解:首先可以想到一个结论;每种电压的灯泡要么全换,要么全不换。因为如果只换部分灯泡,则两种电源都需要,不划算。(为什么我没想到)
先把灯泡按照电压从小到大排序,设sum[ i ] 为前 i 种灯泡的总数量,dp[ i ] 表示为灯泡1~i 的最小开销,那么:
dp[ i ]=min { dp[ j ] + ( sum[ i ] - sum [ j ] )*c[ i ] + k[ i ] }
作者真TM牛逼,以上解释摘自紫书。还是要多学学套路啊!!!!
1 #define INF 1e8 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 8 const int maxn=1005; 9 10 struct node{ 11 int V,K,C,L; 12 bool operator<(const node& i)const{ 13 return V<i.V; 14 } 15 }a[maxn]; 16 17 int n; 18 int dp[maxn],sum[maxn]; 19 20 void solve(){ 21 fill(dp+1,dp+n+1,INF); 22 dp[0]=0; 23 for(int i=1;i<=n;i++) 24 for(int j=0;j<i;j++) 25 dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j])*a[i].C+a[i].K); 26 cout<<dp[n]<<endl; 27 } 28 29 int main() 30 { while(cin>>n&&n){ 31 for(int i=1;i<=n;i++) scanf("%d%d%d%d",&a[i].V,&a[i].K,&a[i].C,&a[i].L); 32 sort(a+1,a+n+1); 33 sum[0]=0,a[0].C=0,a[0].K=0,a[0].L=0,a[0].V=0; 34 for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].L; 35 36 solve(); 37 } 38 return 0; 39 }