POJ 1260 Pearls

题意解释: 有n个等级的珠宝,等级依次升高,等级越高价钱越高,每买一个等级的任何数量的珠宝必须多付10颗此种珠宝的价钱,可以用高等级的珠宝代替低等级的,问要买到若干规定的数量和等级珠宝的最少花费。例如买5颗价值为10的、100颗价值为20的珠宝,有两种方案:一种为分别买两种等级的珠宝价钱为(5+10)*10+(100+10)*20 = 2350;另一种是将等级低的(即价格低)的珠宝全部换为等级高的,此时价钱为(5+100+10)*20 = 2300,故第二种方案较优。

第一,这种代替必定是完全的代替。

因为产生代替可能是因为如果买入一个等级就必须多付10个这种等级的珍珠价钱,所以只有一个等级完全被高等级珍珠替代才有可能产生更优方案。

第二,如果某个等级i的珠宝用比它等级高的珠宝j代替会产生最优解,那么处于等级[i+1,j-1]区间内的珠宝也必须用珠宝j代替。

如上所说,如果中间还存在着一个购买量不为0的珠宝等级x,那么显然用x替代i是更优的,故i+1到j-1将完全被j等级珠宝替代。

ps:刚开始总是WA过不去,后来莫名其妙的过去了,至今没看懂到底为什么。。。无语

 

#include<iostream>
using namespace std;

#define N 2005

int p[N];
int a[N];
int ans[N];
int sum[N];

int main()
{
    int i,j,n,c;
    cin>>n;
      while(n--)
      {
       cin>>c;
       sum[0]=0;
       for(i=1;i<=c;i++)
       {
         cin>>a[i]>>p[i];
         sum[i]=sum[i-1]+a[i];
         ans[i]=p[i]*(sum[i]+10);
       }
       for(i=1;i<=c;i++)
        for(j=1;j<i;j++)
        if(ans[i]>ans[j]+(sum[i]-sum[j]+10)*p[i])
        ans[i]=ans[j]+(sum[i]-sum[j]+10)*p[i];
       cout<<ans[c]<<endl;
      }                         
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值