P1478 陶陶摘蘋果(升級版)

來源:互聯網
上載者:User

標籤:sort   ace   表示   scan   std   clu   node   air   nbsp   

題目描述

又是一年秋季時,陶陶家的蘋果樹結了n個果子。陶陶又跑去摘蘋果,這次她有一個a公分的椅子。當他手夠不著時,他會站到椅子上再試試。

這次與NOIp2005普及組第一題不同的是:陶陶之前搬凳子,力氣只剩下s了。當然,每次摘蘋果時都要用一定的力氣。陶陶想知道在s<0之前最多能摘到多少個蘋果。

現在已知n個蘋果到達地上的高度xi,椅子的高度a,陶陶手伸直的最大長度b,陶陶所剩的力氣s,陶陶摘一個蘋果需要的力氣yi,求陶陶最多能摘到多少個蘋果。

輸入輸出格式 輸入格式:

第1行:兩個數 蘋果數n,力氣s。

第2行:兩個數 椅子的高度a,陶陶手伸直的最大長度b。

第3行~第3+n-1行:每行兩個數 蘋果高度xi,摘這個蘋果需要的力氣yi。

輸出格式:

只有一個整數,表示陶陶最多能摘到的蘋果數。

輸入輸出範例 輸入範例#1:
8 1520 130120 3150 2110 7180 150 8200 0140 3120 2
輸出範例#1:
4
說明

所有資料:n<=5000 a<=50 b<=200 s<=1000

      xi<=280  yi<=100

題目描述

又是一年秋季時,陶陶家的蘋果樹結了n個果子。陶陶又跑去摘蘋果,這次她有一個a公分的椅子。當他手夠不著時,他會站到椅子上再試試。

這次與NOIp2005普及組第一題不同的是:陶陶之前搬凳子,力氣只剩下s了。當然,每次摘蘋果時都要用一定的力氣。陶陶想知道在s<0之前最多能摘到多少個蘋果。

現在已知n個蘋果到達地上的高度xi,椅子的高度a,陶陶手伸直的最大長度b,陶陶所剩的力氣s,陶陶摘一個蘋果需要的力氣yi,求陶陶最多能摘到多少個蘋果。

輸入輸出格式 輸入格式:

第1行:兩個數 蘋果數n,力氣s。

第2行:兩個數 椅子的高度a,陶陶手伸直的最大長度b。

第3行~第3+n-1行:每行兩個數 蘋果高度xi,摘這個蘋果需要的力氣yi。

輸出格式:

只有一個整數,表示陶陶最多能摘到的蘋果數。

輸入輸出範例 輸入範例#1:
8 1520 130120 3150 2110 7180 150 8200 0140 3120 2
輸出範例#1:
4
說明

所有資料:n<=5000 a<=50 b<=200 s<=1000

      xi<=280  yi<=100

上面那位大哥想到了用dp求解,但是那個方程我確實沒看懂,,,
其實這個題可以看做是dp的背包問題
我們有一個體力s
對於每一個能摘(高度在範圍之內)蘋果我們只有摘或者不摘兩種可能性
so我們就把這個題轉化到了01背包問題
狀態轉移方程
dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i].v]+1);
順便說一下,為了保證dp的效率,我事先把所有的蘋果都按高度排了個序,如果當前的蘋果夠不到,說明往後的蘋果都夠不到,直接退出就可以
於是乎就產生了一個問題,第dp[n][maxt]不一定是最大值
最大值需要在每次dp的時候都比較一下
這是這道題和01背包唯一不同的地方

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int n,maxt; 8 int chair,hand; 9 struct node10 {11     int high;12     int v;13 }a[10001];14 int comp(const node & a,const node & b)15 {16     if(a.high!=b.high)17     return a.high<b.high;18     else 19     return a.v<b.v;20 }21 int dp[5001][1001];22 int ans=0;23 int main()24 {25     scanf("%d%d%d%d",&n,&maxt,&chair,&hand);26     hand=hand+chair;27     for(int i=1;i<=n;i++)28         scanf("%d%d",&a[i].high,&a[i].v);29     sort(a+1,a+n+1,comp);30     for(int i=1;i<=n;i++)31     {32         if(hand>=a[i].high)33         {34             for(int j=0;j<=maxt;j++)35             {36                 if(a[i].v<=j)37                     dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i].v]+1);38                 else39                 dp[i][j]=dp[i-1][j];40                 ans=max(ans,dp[i][j]);41             }42             43         }44         else45         break;46     }47     printf("%d",ans);48     return 0;49 }

 

 

P1478 陶陶摘蘋果(升級版)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.