1. 程式人生 > >HDU 3602 2012【01 背包變形】

HDU 3602 2012【01 背包變形】

大於 最大利潤 can sizeof return std nbsp ostream color

題意: 有 n 個團隊和 m 艘船,每艘船的載客量為 k,每個團隊的人數為ai+1 ,轉載該團隊可獲利潤 bi,要求每個團隊的所有人必須在同一艘船上,

且團隊優先級高的團隊所在船編號不能大於優先級低的團隊,求可以獲得的最大利潤。

題解:其實沒什麽,只需要01背包就可以了,只不過優先考慮團隊優先級高的。
分析:dp[i] 表示獲得 i 利潤時需要的最少船位,且要保證優先級高的團隊優先考慮。

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<iostream>
 4 #include<algorithm>
 5
#include<cstring> 6 7 #define INF 0x1f1f1f1f 8 #define v 10005 9 10 int min(int a,int b) 11 { 12 return a<b?a:b; 13 } 14 int dp[v+1]; 15 int n,m,k; 16 int cal(int num,int a) 17 { 18 int tot=(num+k-1)/k; 19 if(num+a<=tot*k) 20 return num+a; 21 return tot*k+a; 22 }
23 int main() 24 { 25 int Cas; 26 scanf("%d",&Cas); 27 while(Cas--) 28 { 29 scanf("%d%d%d",&n,&m,&k); 30 memset(dp,INF,sizeof(dp)); 31 int a,b; 32 dp[0]=0; 33 while(n--) 34 { 35 scanf("%d %d",&a, &b); 36
a++; 37 for(int i=v-1; i>=b; i--) 38 if(dp[i-b]!=INF) 39 dp[i]=min(dp[i],cal(dp[i-b],a)); 40 } 41 int i; 42 for(i=v; i>=0; i--) 43 if(dp[i]<m*k) break; 44 printf("%d\n",i); 45 } 46 }

HDU 3602 2012【01 背包變形】