题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1295
题意:要买n种灯泡。给出每种灯泡的电压、买的数量、单价和相应的变压器的价格。已知低电压的灯泡可用高电压的灯泡代替这样就可以不花低电压灯泡的变压器的钱。求最少代价。
思路:f[i]=min(f[j]+cost[j+1,i]) 0<=j<=i-1
View Code
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #define min(x,y) ((x)<(y)?(x):(y)) 5 using namespace std; 6 7 struct node 8 { 9 int V,K,C,L; 10 11 void get() 12 { 13 scanf("%d%d%d%d",&V,&K,&C,&L); 14 } 15 }; 16 17 18 const int INF=1000000000; 19 int C,num=0; 20 node a[1005]; 21 int f[1005],n,sum[1005]; 22 23 24 int cmp(node a,node b) 25 { 26 return a.V<b.V; 27 } 28 29 int getSum(int L,int R) 30 { 31 return (sum[R]-sum[L-1])*a[R].C+a[R].K; 32 } 33 34 void DP() 35 { 36 int i,j; 37 f[0]=0; 38 f[1]=a[1].K+a[1].C*a[1].L; 39 for(i=2;i<=n;i++) 40 { 41 f[i]=INF; 42 for(j=0;j<i;j++) 43 { 44 f[i]=min(f[i],f[j]+getSum(j+1,i)); 45 } 46 } 47 } 48 49 int main() 50 { 51 for(scanf("%d",&C);C--;) 52 { 53 scanf("%d",&n); 54 int i; 55 for(i=1;i<=n;i++) a[i].get(); 56 sort(a+1,a+n+1,cmp); 57 sum[0]=0; 58 for(i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].L; 59 DP(); 60 printf("Case %d: %d\n",++num,f[n]); 61 } 62 return 0; 63 }