zoukankan      html  css  js  c++  java
  • poj 1260 Pearls

    *题意:

          给定所需珍珠的数量与其相应的价格,计算最小的花费。假如要买某种价格的珍珠必须先额外买10颗,可  以用价格高的替代价格低的。(因此才需要计算最小值)。
          比如:某种珍珠价格p,要买q颗,则花费为:(q+10)*p。再比如:价格100的需要1颗,价格150的需要100颗。买两种珍珠共需要100*(10+1)+150*(100+10)=17600.假如我们用150的代替100的,需要150*(101+10)=16650.显然后者省钱。
    *思路:
          动态规划。
          用sum[i]存储到第i种珍珠时珍珠的总量,dp[i]存储第i种珍珠是最优的购买方式,p[i]是价格,q[i]是数  量。
          则:
             dp[i]=p[i]*(q[i]+10)+dp[i-1] 直接买所需珍珠。
            dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i]) 0<j<i.取得最优。
    #include<iostream>
    #include<cstring>
    using namespace std;
    int main()
    {
         int t,i,j,n;
         int q[102],p[102],dp[102],sum[102];
         cin>>t;
         while(t--)
         {
             cin>>n;
             sum[0]=0;
             dp[0]=0;
             for(i=1;i<=n;i++)
             {
                cin>>q[i]>>p[i];
                sum[i]=sum[i-1]+q[i];
             }
             for(i=1;i<=n;i++)
             {
                 dp[i]=dp[i-1]+(q[i]+10)*p[i];
                 for(j=0;j<i;j++)
                 {
                     if(dp[i]>(sum[i]-sum[j]+10)*p[i]+dp[j])
                        dp[i]=(sum[i]-sum[j]+10)*p[i]+dp[j];
                 }
             }
         cout<<dp[n]<<endl;
         }
         return 0;
    }


         错误思路: 一开始想用动态规划。因为只能用价格高的代替低的,所以就从价格高的开始算,当算到第i种珍珠时,枚举比它价格高的各种珍珠(必须是买过的)根据以上规则取得最小值。结果测试数据都过了,从论坛中找到数据也过了(心中甚是高兴),结果一提交就wrong了。后来想了想才意识到,这种思路分明是贪心!只在乎了眼前的一步。因为在这种思路下,到第i种珍珠时确实给它安排了最好的购买方式,假如在这种最好的购买方式下它是被替代的,这会影响比它价格低的珍珠的最优购买方式,从而使整体不能达到最优。正确的动态规划思路在是假设每种珍珠都可能代替其之前的珍珠,所以整体取得了最优。

  • 相关阅读:
    739. Daily Temperatures
    556. Next Greater Element III
    1078. Occurrences After Bigram
    1053. Previous Permutation With One Swap
    565. Array Nesting
    1052. Grumpy Bookstore Owner
    1051. Height Checker
    数据库入门及SQL基本语法
    ISCSI的概念
    配置一个IP SAN 存储服务器
  • 原文地址:https://www.cnblogs.com/Neptunes/p/3337679.html
Copyright © 2011-2022 走看看