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

 

posted on 2013-10-12 21:40  枫、  阅读(465)  评论(0编辑  收藏  举报