zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Codeforces Round #183 (Div. 2) B. Calendar
    FZU Problem 2030 括号问题
    NEU(1262: ASCII Sequence II)动态规划
    ZOJ(1711)Sum It Up (DFS+剪枝+去重复)
    ZOJ(1004)Anagrams by Stack (DFS+stack)
    HDU(3374) (KMP + 最小表示法)
    FZU Problem 1926 填空(KMP好题一枚,确实好)
    POJ(2481)Cows 树状数组
    HOJ (1042) 整数划分
    LeetCode: Two Sum
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3365940.html
Copyright © 2011-2022 走看看