标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 7705 | Accepted: 3811 |
Description
Input
Output
Sample Input
2 2 100 1 100 2 3 1 10 1 11 100 12
Sample Output
330 1344
题意:要买若干种价值的珍珠,但买某种珍珠必须多付10颗此种珍珠的价钱,及如果买价值为1的珍珠100颗,必须付的钱数为110。一颗珍珠可以用比它贵的珍珠 充数,因此买多种珍珠的时候用贵的代替便宜的可能更省钱。例如买100颗价值为2的、1颗价值为1的,此时买101颗价值为2的为较优方案。输入要买的若 干种珍珠,可用高价珍珠充数的条件下,问最少需要花费多少钱。
注意:题目的价格已给出升序
思路: dp[i]=min(dp[i],dp[j]+(a[j+1]+a[j+2]+...+a[i]+10)*p[i])=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i])
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; const int maxn=1000100; const int INF=(1<<28); int T; int c; int a[maxn],p[maxn]; int dp[maxn]; int sum[maxn]; int main() { cin>>T; while(T--){ cin>>c; a[0]=0; for(int i=1;i<=c;i++){ cin>>a[i]>>p[i]; sum[i]=sum[i-1]+a[i]; } dp[0]=0; for(int i=1;i<=c;i++) dp[i]=INF; for(int i=1;i<=c;i++){ for(int j=0;j<i;j++){ dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i]); } } cout<<dp[c]<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/--560/p/4353331.html