POJ1260Pearls

http://poj.org/problem?id=1260

题意 :这个题大概是讲,给你几种等级不同的珠宝,然后告诉你它的数量和价值,等级是升序排列的,且随等级的升高价值也随之升高,但为了防止有的客户只购买一个珍珠,所以无论买哪一种的珍珠必须额外付这个等级珍珠的10倍的价钱,要求买够它给定的珍珠的种数中每一种珍珠的数量的总和,要求花费最小,等级低的可以用等级高的代替掉。

思路 : 典型的动态规划,就是求一个最优解嘛,这个题倒不什么难,就是思路对很重要,看了大神的解题报告,0MS,挺好的 。

样例解释 : 样例中最开始的2代表的是测试样例的组数,然后是珍珠的种数,等级按升序排列,然后第一组样例中按照题意可以求出两个结果,一个是(100+10)*1+(100+10)*2 = 330,另一个是(100+100+10)*20 = 4200,显然第一种方法比较优,所以输出330,同理,第二种样例中,(1+10)*10+(1+10)*10+(100+10)*12 =1561,(1+1+10)*11+(100+10)*12=1452,(1+1+100+10)*12 =1344,所以最优解是1344

2

2

100 1

100 2

3

1 10

1 11

100 12

 

#include<cstdio>

#include<iostream>

#include<cstring>

using namespace std ;

const int maxn = 1050 ;

int main()

{

    int n,m ;

    cin>>m;

    int ai[maxn],pi[maxn],ans[maxn],sum[maxn] ;

    for(int k = 0 ; k < m ; k++)

    {

        memset(ans,0,sizeof(ans)) ;//ans数组最优状态记录

        sum[0] = 0 ;

        cin>>n ;

        for(int i = 1 ; i <= n ; i++)

        {

            cin>>ai[i]>>pi[i] ;

            sum[i] = sum[i-1]+ai[i] ;//sum数组存的是前i的珠宝总数

            ans[i] = (sum[i] +10)*pi[i] ;//先将可能最优解存入

        }

        for(int i = 1 ; i <= n ; i++)

            for(int j = 1 ; j <= i ; j++)

                ans[i] = min(ans[i],(sum[i]-sum[j]+10)*pi[i]+ans[j]) ;

        cout<<ans[n]<<endl ;

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(PEAR)