标签:
Description
Input
Output
Sample Input
2 2 100 1 100 2 3 1 10 1 11 100 12
Sample Output
330 1344
题意:有c种品质不同的珠宝 ,若要买某一品质的珠宝必须支付(ai+10)*pi,可以用高品质的珠宝代替低品质的
(通过减少购买的种类来节约多支付的10个的价钱).求要买到所有目标数量的珠宝至少要花多少钱
题解:注意题目算价格的方式 注意只能由高品质代替低品质
注意题目中 given in ascending order 珠宝的品质是升序给出的
dp[i] 表示以第i个品质结尾的最优解
dp[i]=min{dp[j-1]+(sum[i]-sum[j-1]+10)*p[i]}
(sum[i]-sum[j-1]+10)*p[i]表示第j种到第i种珍珠全部替换为第i种
1 /****************************** 2 code by drizzle 3 blog: www.cnblogs.com/hsd-/ 4 ^ ^ ^ ^ 5 O O 6 ******************************/ 7 //#include<bits/stdc++.h> 8 #include<iostream> 9 #include<cstring> 10 #include<cstdio> 11 #include<map> 12 #include<algorithm> 13 #include<cmath> 14 #define ll long long 15 #define PI acos(-1.0) 16 #define mod 1000000007 17 using namespace std; 18 int t; 19 int n; 20 int cost[105]; 21 int qu[105]; 22 int sum[105]; 23 int dp[105]; 24 int main() 25 { 26 scanf("%d",&t); 27 for(int i=1; i<=t; i++) 28 { 29 scanf("%d",&n); 30 sum[0]=0; 31 for(int j=1; j<=n; j++) 32 { 33 scanf("%d %d",&cost[j],&qu[j]); 34 sum[j]=sum[j-1]+cost[j]; 35 dp[j]=1e9; 36 } 37 dp[0]=0; 38 for(int j=1; j<=n; j++) 39 { 40 for(int k=1; k<=j; k++) 41 dp[j]=min(dp[j],dp[k-1]+(sum[j]-sum[k-1]+10)*qu[j]); 42 } 43 printf("%d\n",dp[n]); 44 } 45 return 0; 46 }
标签:
原文地址:http://www.cnblogs.com/hsd-/p/5726621.html