题意参考 http://blog.sina.com.cn/s/blog_6635898a0100i381.html
题意:有c个种品质不同的Pearls,若要买某一品质的Pearl必须在你买的数量的基础上,多付10个这种Pearl的价钱,可以用高品质的Pearl代替低品质的(通过将少购买的种类来节约多支付的10个的价钱)。求要买到所有目标Pearls至少要花多少钱。
dp[i]表示 前i种物品 得到的 最优化价格
sum[i] 表示前i种物品数量之和(前缀和)
对于dp[i]我们假设优化 j<i的一些物品的价格,使得p[i]*num[j]<(num[j]+10)*p[j]
那么假设带*的是被优化的(即用p[i]买) 即存在 * * * * X * * i
显然 X表示 其价格没被i优化,而 x<j<i之间 都是用价格i购买的,不可能给X带来价格优化,也就是 X是用p[x]购买的,既然如此,j<x的物品j,通通都不该用 p[i]买,而是应该用 p[x]买,这会让价格更节约。。。。。
因此结论就是 : 如果原价购买物品i,如果可以对其前面的物品进行价格优化,优化区间必然是连续的。。。
于是
dp[i]=inf
dp[i]=min(dp[i], dp[j]+ (sum[i]-sum[j])*p[i] );
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <set> #include <vector> #include <iostream> using namespace std; int min(int a,int b) { return a>b?b:a; } int inf=2147483647; double eps=0.000001; int sum [1005]; int num[1005],p[1005],dp[1005]; int main() { int t;cin>>t; while(t--) { int n,i,k,j; cin>>n; for ( i=1;i<=n;i++) { scanf("%d %d",&num[i],&p[i]); sum[i]=sum[i-1]+num[i]; } for (i=1;i<=n;i++) { dp[i]=inf; for (j=0;j<i;j++) { dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*(p[i])); } } printf("%d\n",dp[n]); } return 0; }