POJ 1260 Pearls

來源:互聯網
上載者:User

題意:

給出幾類珍珠,以及它們的單價,要求用最少的錢就可以買到相同數量的,相同(或更高)品質的珍珠。

規定買任一類的珍珠n個(價格為p),都要支付(n+10)*p的錢,即額外支付10*p。

(1)       要求要買的珍珠的數量是一定的

(2)       所買的珍珠的品質允許提高,但不允許下降(即可以用高品質珍珠替代低品質)

(3)       輸入時,後輸入的珍珠價格一定比前面輸入的要貴

(4)       由(2)(3)知,珍珠的替代必須是連續的,不能跳躍替代。因為,假如方案是用第 i+2 類去替代第 i 類珍珠,而用第 i+1 類去替代第 i 類珍珠會使最終的支付價格更加低;所以,一定是因為第 i+2 類代替了第 i+1 類後會使最終的支付價格更低而使第i類直接被第
i+2 類代替。由此遞推得出,若第 i 類被第 j 類代替,那麼 i 和 j 之間的所有類都會被第j類代替。


令f[i]表示在已知第i類珍珠時,所需支付的最低價格

則狀態方程為:

f[i]=(a[i]+10)*p[i]+f[i-1];  //當第i種珍珠出現時,未最佳化價格的情況

f[i]=min(f[i],(sum[i]-sum[j]+10)*p[i]+f[j]);  //枚舉j,價格最佳化

 

f[0]=0;  //初始化


// Time 0ms; Memory 220K
#include<iostream>using namespace std;int main(){int i,j,t,n,a[110],sum[110],p[110],f[110];cin>>t;while(t--){cin>>n;sum[0]=0;for(i=1;i<=n;i++){cin>>a[i]>>p[i];sum[i]=sum[i-1]+a[i];}f[0]=0;for(i=1;i<=n;i++){f[i]=f[i-1]+(a[i]+10)*p[i];for(j=0;j<i-1;j++) if(f[i]>f[j]+(sum[i]-sum[j]+10)*p[i]){f[i]=f[j]+(sum[i]-sum[j]+10)*p[i];}}cout<<f[n]<<endl;}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.