您的位置:首页 > 其它

POJ 1260 Pearls

2013-07-05 08:55 274 查看
题意:

给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠。

规定买任一类的珍珠n个(价格为p),都要支付(n+10)*p的钱,即额外支付10*p。

(1) 要求要买的珍珠的数量是一定的

(2) 所买的珍珠的质量允许提高,但不允许下降(即可以用高质量珍珠替代低质量)

(3) 输入时,后输入的珍珠价格一定比前面输入的要贵

(4) 由(2)(3)知,珍珠的替代必须是连续的,不能跳跃替代。因为,假如方案是用第 i+2 类去替代第 i 类珍珠,而用第 i+1 类去替代第 i 类珍珠会使最终的支付价格更加低;所以,一定是因为第 i+2 类代替了第 i+1 类后会使最终的支付价格更低而使第i类直接被第
i+2 类代替。由此递推得出,若第 i 类被第 j 类代替,那么 i 和 j 之间的所有类都会被第j类代替。

令f[i]表示在已知第i类珍珠时,所需支付的最低价格

则状态方程为:

f[i]=(a[i]+10)*p[i]+f[i-1]; //当第i种珍珠出现时,未优化价格的情况

f[i]=min(f[i],(sum[i]-sum[j]+10)*p[i]+f[j]); //枚举j,价格优化

f[0]=0; //初始化

// Time 0ms; Memory 220K
#include<iostream>
using namespace std;
int main()
{
int i,j,t,n,a[110],sum[110],p[110],f[110];
cin>>t;
while(t--)
{
cin>>n;
sum[0]=0;
for(i=1;i<=n;i++)
{
cin>>a[i]>>p[i];
sum[i]=sum[i-1]+a[i];
}
f[0]=0;
for(i=1;i<=n;i++)
{
f[i]=f[i-1]+(a[i]+10)*p[i];
for(j=0;j<i-1;j++) if(f[i]>f[j]+(sum[i]-sum[j]+10)*p[i])
{
f[i]=f[j]+(sum[i]-sum[j]+10)*p[i];
}
}
cout<<f
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: