標籤:style class blog c code ext
蘋果
-
描述
-
ctest有n個蘋果,要將它放入容量為v的背包。給出第i個蘋果的大小和價錢,求出能放入背包的蘋果的總價錢最大值。
-
輸入
-
有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和背包的容量v,n、v同時為0時結束測試,此時不輸出。接下來的n行,每行2個正整數,用空格隔開,分別代表蘋果的大小c和價錢w。所有輸入數位範圍大於等於0,小於等於1000。
-
輸出
-
對每組測試資料輸出一個整數,代表能放入背包的蘋果的總價值。
-
範例輸入
-
3 31 12 13 10 0
-
範例輸出
-
2
思路:
就是典型的01背包,用dp[i][j]來代表從第i個蘋果到第n個蘋果能夠裝到背包容量為j的最大價值;dp[i][j]=dp[i+1][j]表示,第i個蘋果沒有裝進背包裡(第i個蘋果的體積比背包的容量大,裝不下);dp[i][j]=max(dp[i+1][j],dp[i+1][j-tiji[i]]+jiazhi[i]);(第i個蘋果的體積不大於背包容量,這時就看這個蘋果放入背包後的最大價值dp[i+1][j-tiji[i]]+jiazhi[i])和未放入背包時的最大值dp[i+1][j]哪個大就取哪個的值。
AC代碼如下:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int dp[1005][1005]; int tiji[1005]; int jiazhi[1005]; int main() { int n,v; while(scanf("%d%d",&n,&v)) { if(n==0&&v==0) break; memset(tiji,0,sizeof(tiji)); memset(jiazhi,0,sizeof(jiazhi)); for(int i=1;i<=n;i++) { scanf("%d",&tiji[i]); scanf("%d",&jiazhi[i]); } memset(dp,0,sizeof(dp)); int jiaoxiao=min(v,tiji[n]-1); for(int j=0;j<=jiaoxiao;j++) { dp[n][j]=0;//如果背包容量小於n的體積,那麼就只裝n蘋果而言肯定是裝不下。 } for(int j=tiji[n];j<=v;j++) { dp[n][j]=jiazhi[n]; } for(int i=n-1;i>1;i--) { jiaoxiao=min(tiji[i]-1,v); for(int j=0;j<=jiaoxiao;j++) { dp[i][j]=dp[i+1][j];//第i個蘋果未裝入 } for(int j=tiji[i];j<=v;j++) { dp[i][j]=max(dp[i+1][j],dp[i+1][j-tiji[i]]+jiazhi[i]); } } dp[1][v]=dp[2][v]; if(tiji[1]<=v) { dp[1][v]=max(dp[2][v],dp[2][v-tiji[1]]+jiazhi[1]); } printf("%d\n",dp[1][v]); } system("pause"); return 0; } |