標籤: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 陶陶摘蘋果(升級版)